Hi付鹿,歡迎來到第5關澜汤。記得按F11(蘋果電腦請按control+command+F),給自己更好的學習體驗舵匾。
上一關俊抵,我們學習了兩種新的數(shù)據(jù)類型:列表和字典。
這一關坐梯,我們要學習的主題是【循環(huán)】务蝠。循環(huán)的意思是:把一件事重復執(zhí)行很多遍。
每個人的生活和工作都充滿了循環(huán)烛缔,很多時候,循環(huán)意味著重復和枯燥轩拨。比如你要手動輸入200個員工的個人信息践瓷,比如她要一遍一遍地給不認真的人費勁口舌解釋同樣的事情,又比如他一成不變亡蓉、如同一潭死水般的生活晕翠。
一成不變的生活終歸需要你自己去打破循環(huán),但工作的事砍濒,就大可讓計算機幫一幫我們了淋肾。與人類不同,計算機不怕苦也不怕累爸邢,無聊的事情可以重復上千遍樊卓,只要能追尋到你想要的答案。
這恰恰就是編程解放人類的地方杠河。比如你需要下載很多很多張圖片碌尔,本來你是要手動操作的,而計算機通過【循環(huán)】券敌,就可以依照某些規(guī)則唾戚,幫你一張一張地下載圖片,你在一旁歇著就好待诅。計算機干重復性的工作比你拿手叹坦。
再比如作為運營,可能需要去解散很多的用戶群卑雁,本來要一個一個手動點擊募书,而計算機通過【循環(huán)】绪囱,就可以依照某些規(guī)則,幫人一個一個解散锐膜。計算機干重復性的工作比你省力毕箍。
現(xiàn)在你再看“循環(huán)”這兩個字,是不是跟開始不太一樣了道盏?
為什么計算機就特別擅長做重復性工作呢而柑?
注意,是“超擅長荷逞、速度超快”媒咳,而不只是“能干活、不抱怨”种远。
究其原理涩澡,其實是因為代碼中的【循環(huán)語句】,讓計算機能夠重復性地坠敷、自動地執(zhí)行指令妙同。
要實現(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)語句
還記得前一關里速警,班主任點名的例子嗎?本來要重復50次才能完成的任務鸯两,最后變成了3行代碼闷旧。
這里的第2-3行就是for循環(huán)。
先看一段最簡單的for循環(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)在的我缀台,為這些時間所做出的選擇。
路還長著呢哮奇,我們下一關再會膛腐。