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

條件循環(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)的恭陡。

image

第 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()

再次運行程序桩皿,你會看到海龜在一條直線上折返爬行。

image

第 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)中運動。

image

第 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-條/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匣屡,一起剝皮案震驚了整個濱河市封救,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捣作,老刑警劉巖誉结,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異券躁,居然都是意外死亡惩坑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門也拜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來以舒,“玉大人,你說我怎么就攤上這事慢哈÷樱” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵卵贱,是天一觀的道長滥沫。 經(jīng)常有香客問我侣集,道長,這世上最難降的妖魔是什么兰绣? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任世分,我火速辦了婚禮,結(jié)果婚禮上缀辩,老公的妹妹穿的比我還像新娘臭埋。我一直安慰自己,他們只是感情好雌澄,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布斋泄。 她就那樣靜靜地躺著,像睡著了一般镐牺。 火紅的嫁衣襯著肌膚如雪炫掐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天睬涧,我揣著相機與錄音募胃,去河邊找鬼。 笑死畦浓,一個胖子當(dāng)著我的面吹牛痹束,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讶请,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼祷嘶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夺溢?” 一聲冷哼從身側(cè)響起论巍,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎风响,沒想到半個月后嘉汰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡状勤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年鞋怀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片持搜。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡密似,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葫盼,到底是詐尸還是另有隱情残腌,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站废累,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脱盲。R本人自食惡果不足惜邑滨,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钱反。 院中可真熱鬧掖看,春花似錦、人聲如沸面哥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尚卫。三九已至归榕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吱涉,已是汗流浹背刹泄。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怎爵,地道東北人特石。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鳖链,于是被迫代替她去往敵國和親姆蘸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容