條件循環能夠讓程序在條件成立時(即為真時)重復執行循環體中的語句。如果條件一直成立(即永遠不會為假),則循環會一直進行下去,不會停止。如果初始時,條件不成立,則循環 1 次也不會執行。Python 中條件循環使用 while 關鍵字來實現。
看下面這段示例代碼,
1 import turtle 2 3 4 turtle.shape("turtle") 5 turtle.speed(0) 6 7 8 def forward(max_distance): 9 distance = 0 10 step = 1 11 while distance < max_distance: 12 turtle.forward(step) 13 distance += step 14 15 16 forward(100) 17 18 19 turtle.exitonclick()
函數 forward 實現的功能和原版的 turtle.forward 是一樣的,但這里我們是借助條件循環來實現的。
第 5 行 turtle.speed(0) 設置海龜爬行的速度。速度的取值為 [0, 10]。當取值在 [1, 10] 之間時,數值越大,繪圖的速度就越快。當取值為 0 時,海龜將以最快的速度繪圖。這里,我們讓海龜以最快的速度爬行。因為,在我們自定義的 forward 函數中(第 8-13 行),我們要讓海龜移動很多步,但每次只移動 1 個很小的距離,為了盡快看到最終繪圖的效果,我們得讓海龜爬得快一些。
第 8 行 def forward(max_distance): 聲明 forward 函數,它有 1 個參數 max_distance。這個函數要實現的功能是,讓海龜一直爬行,直到海龜總的爬行距離達到(或超過) max_distance 時才停止爬行。
第 9 行 distance = 0 變量 distance 用於記錄當前海龜已經累計爬行了多遠的距離。初始時,海龜還沒有開始爬行,因此 distance 的初始值為 0。
第 10 行 step = 1 設置海龜爬行的步長,即每 1 步要爬多遠的距離。
第 11-13 行是用 while 語句實現的條件循環,其中第 11 行, while distance < max_distance: 指明了循環條件為 distance < max_distance 即,當海龜累計爬行距離 (distance) 小於規定的最大爬行距離 (max_distance) 時,執行循環體中的語句(第 12, 13 行)。
第 12, 13 行是循環體,其中第 12 行 turtle.forward(step) 讓海龜以指定步長 step 前進一小段距離。第 13 行 distance += step 這是一種簡寫的形式,它等價於 distance = distance + step ,即將海龜剛才(第 12 行)爬行的那一小段距離累加到 distance 變量中。類似 for 循環,while 循環的循環體(第 12, 13 行)也要比 while 語句所在的行(第 11 行),向右縮進一些,通常我們用連續的 4 個空格來表示一級的縮進。
不過,現在的 forward 跟原版的 turtle.forward 效果是一樣的,沒啥意思,咪博士把代碼改進一下,讓它變得好玩一些。
1 import turtle 2 3 4 turtle.shape("turtle") 5 turtle.speed(0) 6 7 8 def forward(max_distance, max_radius): 9 distance = 0 10 step = 1 11 while distance < max_distance: 12 if turtle.distance(0,0) >= max_radius: 13 angle = turtle.towards(0,0) 14 turtle.setheading(angle) 15 turtle.forward(step) 16 distance += step 17 18 19 forward(550, 100) 20 21 22 turtle.exitonclick()
再次運行程序,你會看到海龜在一條直線上折返爬行。
第 8 行 def forward(max_distance, max_radius): 我們為 forward 函數引入了一個新的參數 max_radius。后面,我們要實現的功能是當海龜離開原點的距離達到(或超過) max_radius 時,就調頭往回爬,即往復爬行。
實現往復爬行對應的代碼在第 12-14 行。
第 12 行 if turtle.distance(0,0) >= max_radius: ,其中 turtle.distance(0,0) 返回的是海龜與原點 (0, 0) 的距離。因此,當海龜與原點的距離達到或超過 max_radius 時,if 條件成立,程序將執行相應的語句(第 13, 14 行)。
第 13 行 angle = turtle.towards(0,0) ,其中 turtle.towards(0,0) 返回的是海龜朝向原點 (0, 0) 的角度。計算角度時,水平向右為 0 度,逆時針方向為角度增大的方向。
第 14 行 turtle.setheading(angle) 直接設定海龜的朝向,由於前面(第 13 行),將 angle 的值設置為海龜朝向原點的角度,所以這里經過 setheading 設置之后,海龜將朝向原點的方向。因此,后面再調用 turtle.forward (第 15 行),海龜就會往原點的方向移動,即往回爬行。
現在,海龜能夠在一條直線上往復爬行,雖然比之前改進了一些,但還是顯得比較單調。接下來,咪博士再進一步改進代碼,讓它變得更生動一些。
1 import turtle 2 import random 3 4 5 turtle.shape("turtle") 6 turtle.speed(0) 7 8 9 def forward(max_distance, max_radius): 10 distance = 0 11 step = 1 12 while distance < max_distance: 13 if turtle.distance(0,0) >= max_radius: 14 angle = turtle.towards(0,0) + random.randint(-45, 45) 15 turtle.setheading(angle) 16 turtle.forward(step) 17 distance += step 18 19 20 forward(10000, 100) 21 22 23 turtle.exitonclick()
運行上面的代碼,你會看到海龜隨機地往返爬行。剛開始,你看不出什么規律,但等它爬行一段時間之后,你會發現海龜實際上是被限制在一個圓圈當中運動。
第 2 行 import random 導入 random 模塊,用於生成隨機數。
第 14 行 angle = turtle.towards(0,0) + random.randint(-45, 45) 其中的 random.randint(-45, 45) 用於產生 [-45, 45] 之間的隨機整數,將這個隨機整數加到朝向原點的角度上,這樣海龜就不再精確地朝向原點,而是有一個隨機波動的角度。因此,海龜就不再精確地按原路返回,從而擺脫直線的束縛。
但是,原來的 2 個約束依然存在:
- 海龜離開原點的距離不能超過 max_radius(第 13 行),所以它被限制在一個圓圈中運動
- 海龜總的運動距離不能超過 max_distance (第 12 行),所以它最終會停止運動
原文鏈接:http://www.ipaomi.com/2017/11/28/python-零基礎-快速入門-趣味教程-咪博士-海龜繪圖-turtle-7-條/