條件循環(huán)能夠讓程序在條件成立時(即為真時)重復(fù)執(zhí)行循環(huán)體中的語句。如果條件一直成立(即永遠不會為假)辜妓,則循環(huán)會一直進行下去为居,不會停止碌宴。如果初始時,條件不成立蒙畴,則循環(huán) 1 次也不會執(zhí)行贰镣。Python 中條件循環(huán)使用 while 關(guān)鍵字來實現(xiàn)呜象。
看下面這段示例代碼,
import turtle
turtle.shape("turtle")
turtle.speed(0)
def forward(max_distance):
distance = 0
step = 1
while distance < max_distance:
turtle.forward(step)
distance += step
forward(100)
turtle.exitonclick()
函數(shù) forward 實現(xiàn)的功能和原版的 turtle.forward 是一樣的碑隆,但這里我們是借助條件循環(huán)來實現(xiàn)的恭陡。
第 5 行 turtle.speed(0) 設(shè)置海龜爬行的速度。速度的取值為 [0, 10]上煤。當(dāng)取值在 [1, 10] 之間時休玩,數(shù)值越大,繪圖的速度就越快劫狠。當(dāng)取值為 0 時拴疤,海龜將以最快的速度繪圖。這里独泞,我們讓海龜以最快的速度爬行呐矾。因為,在我們自定義的 forward 函數(shù)中(第 8-13 行)阐肤,我們要讓海龜移動很多步凫佛,但每次只移動 1 個很小的距離,為了盡快看到最終繪圖的效果孕惜,我們得讓海龜爬得快一些愧薛。
第 8 行 def forward(max_distance): 聲明 forward 函數(shù),它有 1 個參數(shù) max_distance衫画。這個函數(shù)要實現(xiàn)的功能是毫炉,讓海龜一直爬行,直到海龜總的爬行距離達到(或超過) max_distance 時才停止爬行削罩。
第 9 行 distance=0 變量 distance 用于記錄當(dāng)前海龜已經(jīng)累計爬行了多遠的距離瞄勾。初始時,海龜還沒有開始爬行弥激,因此 distance 的初始值為 0进陡。
第 10 行 step=1 設(shè)置海龜爬行的步長,即每 1 步要爬多遠的距離微服。
第 11-13 行是用 while 語句實現(xiàn)的條件循環(huán)趾疚,其中第 11 行, while distance<max_distance: 指明了循環(huán)條件為 distance<max_distance 即以蕴,當(dāng)海龜累計爬行距離 (distance) 小于規(guī)定的最大爬行距離 (max_distance) 時糙麦,執(zhí)行循環(huán)體中的語句(第 12, 13 行)。
第 12, 13 行是循環(huán)體丛肮,其中第 12 行 turtle.forward(step) 讓海龜以指定步長 step 前進一小段距離赡磅。第 13 行 distance+=step 這是一種簡寫的形式,它等價于 distance=distance+step 宝与,即將海龜剛才(第 12 行)爬行的那一小段距離累加到 distance 變量中焚廊。類似 for 循環(huán)冶匹,while 循環(huán)的循環(huán)體(第 12, 13 行)也要比 while 語句所在的行(第 11 行),向右縮進一些节值,通常我們用連續(xù)的 4 個空格來表示一級的縮進徙硅。
不過,現(xiàn)在的 forward 跟原版的 turtle.forward 效果是一樣的搞疗,沒啥意思嗓蘑,咪博士把代碼改進一下,讓它變得好玩一些匿乃。
import turtle
turtle.shape("turtle")
turtle.speed(0)
def forward(max_distance, max_radius):
distance = 0
step = 1
while distance < max_distance:
if turtle.distance(0,0) >= max_radius:
angle = turtle.towards(0,0)
turtle.setheading(angle)
turtle.forward(step)
distance += step
forward(550, 100)
turtle.exitonclick()
再次運行程序桩皿,你會看到海龜在一條直線上折返爬行。
第 8 行 def forwar(max_distance,max_radius): 我們?yōu)?forward 函數(shù)引入了一個新的參數(shù) max_radius幢炸。后面泄隔,我們要實現(xiàn)的功能是當(dāng)海龜離開原點的距離達到(或超過) max_radius 時,就調(diào)頭往回爬宛徊,即往復(fù)爬行佛嬉。
實現(xiàn)往復(fù)爬行對應(yīng)的代碼在第 12-14 行。
第 12 行 if turtle.distance(0,0)>=max_radius: 闸天,其中 turtle.distance(0,0) 返回的是海龜與原點 (0, 0) 的距離暖呕。因此,當(dāng)海龜與原點的距離達到或超過 max_radius 時苞氮,if 條件成立湾揽,程序?qū)?zhí)行相應(yīng)的語句(第 13, 14 行)。
第 13 行 angle=turtle.towards(0,0) 笼吟,其中 turtle.towards(0,0) 返回的是海龜朝向原點 (0, 0) 的角度库物。計算角度時,水平向右為 0 度贷帮,逆時針方向為角度增大的方向戚揭。
第 14 行 turtle.setheading(angle) 直接設(shè)定海龜?shù)某颍捎谇懊妫ǖ?13 行)撵枢,將 angle 的值設(shè)置為海龜朝向原點的角度毫目,所以這里經(jīng)過 setheading 設(shè)置之后,海龜將朝向原點的方向诲侮。因此,后面再調(diào)用 turtle.forward (第 15 行)箱蟆,海龜就會往原點的方向移動沟绪,即往回爬行。
現(xiàn)在空猜,海龜能夠在一條直線上往復(fù)爬行绽慈,雖然比之前改進了一些恨旱,但還是顯得比較單調(diào)。接下來坝疼,咪博士再進一步改進代碼搜贤,讓它變得更生動一些。
import turtle
import random
turtle.shape("turtle")
turtle.speed(0)
def forward(max_distance, max_radius):
distance = 0
step = 1
while distance < max_distance:
if turtle.distance(0,0) >= max_radius:
angle = turtle.towards(0,0) + random.randint(-45, 45)
turtle.setheading(angle)
turtle.forward(step)
distance += step
forward(10000, 100)
turtle.exitonclick()
運行上面的代碼钝凶,你會看到海龜隨機地往返爬行仪芒。剛開始,你看不出什么規(guī)律耕陷,但等它爬行一段時間之后掂名,你會發(fā)現(xiàn)海龜實際上是被限制在一個圓圈當(dāng)中運動。
第 2 行 import random 導(dǎo)入 random 模塊哟沫,用于生成隨機數(shù)饺蔑。
第 14 行 angle=turtle.towards(0,0)+random.randint(-45,45) 其中的 random.randint (-45,45) 用于產(chǎn)生 [-45, 45] 之間的隨機整數(shù),將這個隨機整數(shù)加到朝向原點的角度上嗜诀,這樣海龜就不再精確地朝向原點猾警,而是有一個隨機波動的角度。因此隆敢,海龜就不再精確地按原路返回发皿,從而擺脫直線的束縛。
但是筑公,原來的 2 個約束依然存在:
- 海龜離開原點的距離不能超過 max_radius(第 13 行)雳窟,所以它被限制在一個圓圈中運動
- 海龜總的運動距離不能超過 max_distance (第 12 行),所以它最終會停止運動
原文鏈接:http://www.ipaomi.com/2017/11/28/python-零基礎(chǔ)-快速入門-趣味教程-咪博士-海龜繪圖-turtle-7-條/