Python 零基礎 快速入門 趣味教程 (咪博士 海龜繪圖 turtle) 7. 條件循環


條件循環能夠讓程序在條件成立時(即為真時)重復執行循環體中的語句。如果條件一直成立(即永遠不會為假),則循環會一直進行下去,不會停止。如果初始時,條件不成立,則循環 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-條/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM