第5關:消滅該死的重復(上)

Hi付鹿,歡迎來到第5關澜汤。記得按F11(蘋果電腦請按control+command+F),給自己更好的學習體驗舵匾。

上一關俊抵,我們學習了兩種新的數(shù)據(jù)類型:列表和字典。

這一關坐梯,我們要學習的主題是【循環(huán)】务蝠。循環(huán)的意思是:把一件事重復執(zhí)行很多遍。


循環(huán)

每個人的生活和工作都充滿了循環(huán)烛缔,很多時候,循環(huán)意味著重復和枯燥轩拨。比如你要手動輸入200個員工的個人信息践瓷,比如她要一遍一遍地給不認真的人費勁口舌解釋同樣的事情,又比如他一成不變亡蓉、如同一潭死水般的生活晕翠。

一成不變的生活終歸需要你自己去打破循環(huán),但工作的事砍濒,就大可讓計算機幫一幫我們了淋肾。與人類不同,計算機不怕苦也不怕累爸邢,無聊的事情可以重復上千遍樊卓,只要能追尋到你想要的答案。

這恰恰就是編程解放人類的地方杠河。比如你需要下載很多很多張圖片碌尔,本來你是要手動操作的,而計算機通過【循環(huán)】券敌,就可以依照某些規(guī)則唾戚,幫你一張一張地下載圖片,你在一旁歇著就好待诅。計算機干重復性的工作比你拿手叹坦。

再比如作為運營,可能需要去解散很多的用戶群卑雁,本來要一個一個手動點擊募书,而計算機通過【循環(huán)】绪囱,就可以依照某些規(guī)則,幫人一個一個解散锐膜。計算機干重復性的工作比你省力毕箍。

現(xiàn)在你再看“循環(huán)”這兩個字,是不是跟開始不太一樣了道盏?

為什么計算機就特別擅長做重復性工作呢而柑?

注意,是“超擅長荷逞、速度超快”媒咳,而不只是“能干活、不抱怨”种远。

究其原理涩澡,其實是因為代碼中的【循環(huán)語句】,讓計算機能夠重復性地坠敷、自動地執(zhí)行指令妙同。


循環(huán)語句

要實現(xiàn)“重復、自動地執(zhí)行代碼”膝迎,有兩種循環(huán)語句可供我們選擇使用:一種是for...in...循環(huán)語句粥帚,另一種是while循環(huán)語句。

“循環(huán)”在計算機中是非常重要限次,是最基礎的編程知識芒涡,為了講解得更加清楚,我們將循環(huán)這一章節(jié)分成了上下兩關卖漫。這一關费尽,我們將對兩種循環(huán)語句形成初步的了解,并學會簡單的應用羊始。

話不多說旱幼,我們先一起來看看第一種循環(huán)的方式:for...in...循環(huán),它也被簡稱為for循環(huán)店枣。

for...in...循環(huán)語句


for 循環(huán)

還記得前一關里速警,班主任點名的例子嗎?本來要重復50次才能完成的任務鸯两,最后變成了3行代碼闷旧。


例子

這里的第2-3行就是for循環(huán)。

先看一段最簡單的for循環(huán)代碼钧唐,了解它的格式:


循環(huán)

來忙灼,先運行一下圖中的示例代碼。


例子

終端上依次出現(xiàn)了列表里的所有數(shù)字,對吧该园?我們用大白話來打個比方酸舍,以便更好地理解這段代碼的意義:


例子


解釋

for循環(huán)的3個要點即是:

1.空房間;2.一群等著辦業(yè)務的人里初;3.業(yè)務流程

我們一個一個來看:

for循環(huán):空房間


房間


空房間的學名叫【元素】(item)啃勉,你可以把它當成是一個變量。那么首先双妨,我們需要給房間取一個名字淮阐,也就是“變量名”。

為什么我總是用i刁品?因為英文是item泣特,所以i是常用名嘛。但其實你給這個房間取什么名字都行挑随。

來状您,直接運行一下代碼試試。


是不是三種結果都一樣兜挨?這就對啦膏孟,

拘束姓名。

在for循環(huán)結束之后拌汇,我們還能使用這個房間骆莹,不過這時候房間里的人是誰呢?

請運行代碼體驗一下:


原來担猛,業(yè)務結束之后,最后一個走進去的5留在了房間里丢氢,被打印了出來傅联。

搞清楚了什么是“空房間”,我們再看看下一個要點:

for循環(huán):一群排隊辦業(yè)務的人


我們剛剛看到的“一群排隊辦業(yè)務的人”疚察,

都是以列表的形式出現(xiàn):[1,2,3,4,5]蒸走。還有哪些數(shù)據(jù)類型也屬于“一群排隊辦業(yè)務的人”呢?

我覺得你已經(jīng)猜到了貌嫡,就是字典比驻。來直接體驗一下代碼運行效果:


我們用print(i)把“空房間”i打印了出來,發(fā)現(xiàn)i會逐個接待字典中的每一個【鍵】岛抄。

那什么不屬于“一群排隊辦業(yè)務的人”呢别惦?請你猜一猜:


答案是B,字典夫椭、列表和字符串'吳承恩'都是一群排隊辦業(yè)務的人掸掸,但a = 5并不是。

哈哈,是不是做題時有點猶豫扰付,看到答案后有些疑惑:為什么'吳承恩'也可以堤撵?

不要懷疑,字符串也屬于“一群排隊辦業(yè)務的人”羽莺。打個比方实昨,'吳承恩'三個字就像一家三口,但走進空房間辦業(yè)務時盐固,這家人是可以一個一個進去的荒给。來試試吧。


而整數(shù)闰挡、浮點數(shù)是不屬于“一群排隊辦業(yè)務的人”的锐墙,如果把它們放在for循環(huán)里,代碼會報錯长酗。

請你體驗一下報錯的代碼溪北,遇到報錯后,可以把代碼修改成正確的夺脾,或者點擊【跳過】按鈕之拨。


現(xiàn)在我們理解了:列表,字典咧叭,字符串都可以是“一群排隊辦業(yè)務的人”蚀乔。


還是這段代碼,代碼的運行結果你應該已經(jīng)了然于心菲茬,是1,2,3,4,5依次出現(xiàn)吉挣。也就是說,當這一群排隊的人依次序走進空房間婉弹,每個人都會把業(yè)務辦完睬魂。

這個過程,在Python中的學名就叫做【遍歷】镀赌。

其實氯哮,遍歷這個詞在古代漢語中就已經(jīng)出現(xiàn)過了:


只不過古人是遍歷名山大川,一一尋訪學問商佛;而Python是遍歷數(shù)據(jù)結構(列表喉钢、字典等),一一訪問其中的數(shù)據(jù)良姆。

除了列表肠虽,字典,字符串三種數(shù)據(jù)類型玛追,我們還可以遍歷其他的數(shù)據(jù)集合舔痕。比如和for循環(huán)常常一起搭配使用的:

range() 函數(shù)。


運行后,你看到了整數(shù)0伯复,1慨代,2,是不是啸如?

使用range(x)函數(shù)侍匙,就可以生成一個從0到x-1的整數(shù)序列。

它還有更多用法叮雳,再來看這段代碼想暗,并運行:


使用range(a,b)?函數(shù),你可以生成了一個【取頭不取尾】的整數(shù)序列帘不。

你可能會想問说莫,我沒事兒取這些整數(shù)出來干嘛?

嗯寞焙,這是個好問題储狭。再來看一段代碼,并運行:


重要的事情說三遍,哈哈。

像這樣徘六,有了range()函數(shù)之后,當你想把一段代碼固定重復n次時缭保,就可以直接使用for i in range(n)解決問題。

來練習一下:如果你要重復打印“書桓走的第n天,想他”,n為0到10着茸,你會怎么寫?


答案


答案

range()函數(shù)還有一種用法琐旁,我們來直接運行體驗一下:



你觀察出規(guī)律了么元扔?這里range(0,10,3)的意思是:從0數(shù)到9(取頭不取尾),數(shù)數(shù)的間隔為3旋膳。


好啦,我們來實戰(zhàn)一下:請你用for循環(huán)完成1到100的整數(shù)分別乘以5的計算途事,并打印出來验懊,效果就像這樣:


你會怎么寫出for循環(huán)代碼呢?


你答對了尸变!range(1,101 )表示從1-100的整數(shù)列表义图,不包括101。

請開始寫代碼吧:


答案

老師的答案是這樣的:

我們最后來理解一下for循環(huán)的第三個要點:

for循環(huán):辦事流程


我們以下面的代碼為例:

這兩行代碼中召烂,in表示從“一群排隊辦業(yè)務的人”(字符串碱工、列表、字典等)中依次取值,這個剛才我們已經(jīng)學過了怕篷。

在循環(huán)的過程中历筝,“一群排隊辦業(yè)務的人”會被依次取出,然后走進房間i去辦理業(yè)務廊谓。

但辦事流程呢梳猪?在這里流程很簡單,都是print(i*5)蒸痹。然后在i=1的情況下春弥,執(zhí)行一遍流程;在i=2的情況下叠荠,再執(zhí)行一遍流程……一直執(zhí)行到i=5匿沛,也就把這群人的事情全部辦完了:


“辦事流程”的學名是【for子句】。格式是【冒號】后另起一行榛鼎,【縮進】寫命令逃呼。

格式對于編程來說是一件再怎么強調(diào)也不為過的“小事”,所以在這里我們再強調(diào)一下for循環(huán)的格式:


格式

到這里借帘,你已經(jīng)掌握for循環(huán)的基本語法了蜘渣,我們再做一些練習。

假設你要做大采購肺然,讓小明買醋蔫缸,小紅買油,小白買鹽际起,小張買米拾碌;我們先把這堆事情寫成一個字典:d = {'小明':'醋','小紅':'油','小白':'鹽'}

如果我們把這四個人要買的東西依次print出來,要寫4句print語句:


請你來動手用for循環(huán)代替以上重復性代碼街望,并起到同樣的效果校翔。


老師的答案是這樣的:


你做對了嗎?如果有點不確定灾前,可以回頭補一補上一關“字典”的相關知識防症。

到這里,for循環(huán)的3個要點都講解完畢:


好了哎甲,我們學完了for循環(huán)蔫敲,我們來看看另一種循環(huán)方式。

while循環(huán)


先來看看while循環(huán)長啥樣:


你猜一猜炭玫,圖中代碼的運行結果會是怎么樣的呢奈嘿?


還是1,2,3,4,5依次出現(xiàn),對吧吞加?我們也用大白話去解釋一下這段代碼裙犹。

和for循環(huán)語句不同尽狠,while語句沒有“空房間”,也不是“把一群排隊辦業(yè)務的人做完”叶圃。它是“在一定的條件下”袄膏,“按照流程辦事”。



很明顯盗似,while循環(huán)有2個要點:1.放行條件哩陕;2.辦事流程。咱們先看第一個赫舒。

while循環(huán):放行條件


while在英文中表示“當”悍及,while后面跟的是一個條件。當條件被滿足時接癌,就會循環(huán)執(zhí)行while內(nèi)部的代碼(while子句)心赶。

所以while循環(huán)本質(zhì)上像是一個哨卡:只要事情符合條件,那就一遍又一遍的“按流程辦事”缺猛。

就像在上面的例題中缨叫,只要a<5這個條件成立,就不停地辦事(把a+1的結果打印出來)荔燎,直到條件不成立耻姥,辦事流程就停止。


同樣有咨,while語句也要注意代碼規(guī)范:


和for循環(huán)一樣琐簇,冒號和內(nèi)部代碼的縮進都是必不可少的。╭(╯^╰)╮寫不規(guī)范的話計算機又給你報錯座享,然后你又卡在莫名其妙的地方很久噢......

下面婉商,我們用一個好玩兒的案例來說明while的具體用法,不曉得同學們有沒有看過金庸的武俠小說《神雕俠侶》渣叛?

小說里的主角小龍女(古墓派掌門人)自小在終南山上的古墓里生活丈秩。這個門派有個規(guī)定,除非有男人愿意為掌門人死淳衙,否則掌門人永遠不能出墓門半步蘑秽。

在Python中,這個故事的邏輯就被翻譯成:當(while)沒有男人愿意為小龍女去死的時候箫攀,小龍女要一直一直一直生活在古墓里肠牲,這就是一種循環(huán)。只有當條件(沒有男人愿意為小龍女去死)為假的時候匠童,就可以打破循環(huán),小龍女就能出古墓下山了塑顺。

這段代碼我先寫出來汤求,你看看~


第1行代碼:定義了變量man為空的字符串俏险。使用變量前要先定義變量并為變量賦值,下面我們還會繼續(xù)用到變量man扬绪。

第2行代碼:while后面有一個條件竖独,當這個條件被滿足時,即man != '有'時挤牛,放行莹痢、辦事。開始執(zhí)行循環(huán)內(nèi)部代碼墓赴,即第3行的代碼竞膳,開始詢問。

第3行代碼:詢問現(xiàn)在有男人愿意為小龍女死嗎诫硕?輸入完信息后坦辟,回到第2行代碼,重新判斷條件真假章办。直到條件被判斷為假锉走,即man == '有',while循環(huán)才結束藕届。

第4行代碼:while 循環(huán)結束后的代碼挪蹭,也是循環(huán)外部的代碼。因為當有男人愿意為小龍女死的時候休偶,while 后面的條件就為假梁厉,此時,程序會結束循環(huán)椅贱,去運行第五行代碼懂算。

我們來運行一下好了,同樣需要你輸入內(nèi)容庇麦。你可以先隨便輸入幾個數(shù)據(jù)计技,只要你輸入的不是有,代碼就會一直循環(huán)山橄;直到你輸入有垮媒,循環(huán)會結束。



幸運的是航棱,小說的男主角楊過在因緣際會下睡雇,來到了活死人墓,和小龍女互生情愫饮醇。楊過對小龍女用情很深它抱,愿意為她而死,所以滿足了師門的規(guī)定朴艰,小龍女就可以出古墓下山了观蓄。

好了混移,你感受過了while循環(huán)的邏輯之后,現(xiàn)在我想請你自己動手練一練侮穿。放心歌径,沒那么難,有疑問的話看看小龍女的例題亲茅。

這個畫風突變的故事是這樣的:你家的大門是密碼門回铛,密碼是你的生日816。當輸錯密碼錯誤的時候克锣,會提示“請嘗試輸入密碼:”茵肃。直到密碼輸入正確,就會提示“歡迎回家娶耍!”免姿。

終端的運行效果應該差不多長這樣:


請你補全這段代碼吧:


沒有達到期望的效果

老師的答案是這樣的:


正確答案

對照正確答案,發(fā)現(xiàn)了自己的錯誤

input語句放的位置不對榕酒,導致程序或者陷入死循環(huán)胚膊,或者沒完全執(zhí)行到位


做對了吧?先恭喜你呀想鹰。

那什么紊婉,或許你會有小小的疑惑(很可能也沒注意到),816到底是誰的生日辑舷?偷偷告訴你喻犁,是95版《神雕俠侶》女主角李若彤的生日,永遠的小龍女何缓。


好啦肢础,言歸正傳。我們再看看while循環(huán)的第二個要點:辦事流程碌廓。

while循環(huán):辦事流程


while循環(huán)传轰,在滿足條件的時候,會一輪又一輪地循環(huán)執(zhí)行代碼谷婆。

我們來做道選擇題慨蛙,請看代碼回答問題:


不是噢。這次print(a)不是子句纪挎,沒有縮進期贫,而是在外面哦。

這道題跟一開始的例題非常相似异袄,唯一的區(qū)別在于print(a)有沒有縮進通砍。

有縮進的時候,print(a)也是循環(huán)中的“辦事流程”烤蜕,會將數(shù)字逐一打印封孙。沒有縮進的時候垢揩,循環(huán)中的“辦事流程”就只有做加法,print(a)也就只會打印循環(huán)結束時的最后一個數(shù)字敛瓷。

稍微有點費事是不?我們來做一下分解斑匪,看看每一行代碼的含義:


可以看到呐籽,最后一輪循環(huán)的時候a=4,然后最后a的值被加1后等于5:


所以蚀瘸,縮進后的【while子句】才是會被循環(huán)執(zhí)行的“辦事流程”狡蝶,這一點,你應該差不多明白了吧~

那贮勃,我們再來做一個小練習贪惹。

之前,我們用for循環(huán)解過“1到100分別乘以5”的題目:

如果現(xiàn)在用while循環(huán)寂嘉,應該怎么寫呢奏瞬?你來試試看。


我的答案

如果用while循環(huán)解“1到100分別乘以5”的題目泉孩,老師的答案是這樣的:


老師的答案

到這里硼端,for循環(huán)和whlie循環(huán)的知識就都學完了~

for循環(huán)和while循環(huán)都可以幫我們完成重復性的勞動,那到底兩個循環(huán)有什么區(qū)別寓搬,什么時候用for什么時候用while呢珍昨?讓我們來對比一下。

兩種循環(huán)對比


for循環(huán)和whlie循環(huán)最大的區(qū)別在于【循環(huán)的工作量是否確定】句喷,for循環(huán)就像空房間依次辦理業(yè)務镣典,直到把【所有工作做完】才下班。但while循環(huán)就像哨卡放行唾琼,【滿足條件就一直工作】兄春,直到不滿足條件就關閉哨卡。

所以說父叙,當我們【工作量確定】的時候神郊,我們就可以讓for循環(huán)來完成重復性工作。反之趾唱,要【工作量不確定時】可以讓while循環(huán)來工作:


要把字符串'神雕俠侶'拆成一個個字符打印出來涌乳,這件事【工作量確定】,適合用for循環(huán)甜癞。

而對于“輸入密碼夕晓,判斷輸入的密碼是否正確”這件事,我們并不知道要判斷幾遍才能得到正確密碼悠咱,所以【工作量不確定】蒸辆,適合用while循環(huán)征炼。

不過有一種情況for循環(huán)和while循環(huán)都可以解決問題,那就是【把一件事情做N遍】:


你會看到躬贡,兩者都能做谆奥。不過for循環(huán)的代碼相對更簡潔一些。

讓我們總結一下什么時候用for什么時候用while:


總結

好啦拂玻,《消滅該死的重復(上)》所有的知識酸些,我們就講完了。

來到這一關的尾聲檐蚜,想說一說“循環(huán)”魄懂。

正如開頭所說,計算機能幫我們做的闯第,是許許多多繁雜重復的工作市栗。

當計算機為我們解放雙手,這平凡的日子就空出了一些時間咳短。

這些時間填帽,你會用來做什么呢?

曾有一段日子咙好,我選擇讓自己的思想任意馳騁盲赊,想看看哪里是我的邊緣。

后來敷扫,我用那些多出來的時間回歸生活哀蘑,學習陪伴家人,學習表達我的珍惜葵第。

而此時绘迁,此地,此刻的每一個你卒密,就是現(xiàn)在的我缀台,為這些時間所做出的選擇。

路還長著呢哮奇,我們下一關再會膛腐。














?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鼎俘,隨后出現(xiàn)的幾起案子哲身,更是在濱河造成了極大的恐慌,老刑警劉巖贸伐,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勘天,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機脯丝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門商膊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宠进,你說我怎么就攤上這事晕拆。” “怎么了材蹬?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵潦匈,是天一觀的道長。 經(jīng)常有香客問我赚导,道長,這世上最難降的妖魔是什么赤惊? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任吼旧,我火速辦了婚禮,結果婚禮上未舟,老公的妹妹穿的比我還像新娘圈暗。我一直安慰自己,他們只是感情好裕膀,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布员串。 她就那樣靜靜地躺著,像睡著了一般昼扛。 火紅的嫁衣襯著肌膚如雪寸齐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天抄谐,我揣著相機與錄音渺鹦,去河邊找鬼。 笑死蛹含,一個胖子當著我的面吹牛毅厚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浦箱,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼吸耿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酷窥?” 一聲冷哼從身側響起咽安,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤柱徙,失蹤者是張志新(化名)和其女友劉穎合蔽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體具篇,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年募逞,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛋铆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡放接,死狀恐怖刺啦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纠脾,我是刑警寧澤玛瘸,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站苟蹈,受9級特大地震影響糊渊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慧脱,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一渺绒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菱鸥,春花似錦宗兼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹊漠,卻和暖如春主到,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躯概。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工镰烧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楞陷。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓怔鳖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親固蛾。 傳聞我的和親對象是個殘疾皇子结执,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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