第四章2:for 循環(huán)
《Python projects for beginners》是我所見最友好的Python入門書,前段時(shí)間我組織并與幾位Python愛好者一起對(duì)此書翻譯為中文,特別感謝參與翻譯的這些小伙伴,你們辛苦了。我正在以推文形式連載出來,歡迎學(xué)習(xí)。
星期二:for循環(huán)
今天將花費(fèi)很多頁(yè)面來介紹一個(gè)項(xiàng)目中的關(guān)鍵概念——循環(huán)。在實(shí)際應(yīng)用中,你需要多次運(yùn)行相同的代碼。相比于我們多次重復(fù)寫下相同的代碼行,循環(huán)對(duì)于我們就方便很多了。在Python中,有兩種循環(huán)類型,今天的課程中我們將介紹“For循環(huán)”。
為了跟上這一課,讓我們繼續(xù)在上一個(gè)notebook文件“Week_04”寫代碼并且只增加一個(gè)內(nèi)容為“For循環(huán)”的markdown模塊。
循環(huán)如何工作
循環(huán)就是項(xiàng)目如何多次返回相同代碼行,執(zhí)行相同的命令。在一個(gè)條件滿足之前,循環(huán)會(huì)一直運(yùn)行。以射擊游戲?yàn)槔悄惬@勝或你的生命值耗盡,否則游戲會(huì)一直運(yùn)行下去。一旦這兩個(gè)條件出現(xiàn)一個(gè),游戲就會(huì)終止。
注意:它對(duì)于盡可能少的行來縮減你的代碼非常重要,同時(shí),對(duì)于項(xiàng)目運(yùn)行也更有效率。
無論你是否知道這一概念,循環(huán)存在我們生命中無所不在。每天我們起床,上班,睡覺,我們是當(dāng)一個(gè)常識(shí)來知道他們,但是它卻是一個(gè)簡(jiǎn)單的循環(huán)。我們每天重復(fù)相同的過程,直到 們遇到周未。這一概念正是我們項(xiàng)目中的循環(huán)。
寫下一個(gè)For循環(huán)
For循環(huán)主要應(yīng)用在循環(huán)一系列數(shù)字。以表4-1為例,這個(gè)語(yǔ)法表明循環(huán)將返回五次。------每一個(gè)循環(huán)都是使用關(guān)鍵詞“For”來聲明開始。這個(gè)時(shí)候你會(huì)定義一個(gè)暫時(shí)變量,有時(shí)是作為一個(gè)計(jì)數(shù)或索引。接下來是關(guān)鍵詞“in”,隨后便是范圍函數(shù)(范圍函數(shù)將在之后解釋)。最后,我們使用冒號(hào)來聲明結(jié)束。對(duì)于所有的循環(huán)都遵循這樣的結(jié)構(gòu):關(guān)鍵詞For、暫時(shí)變量、關(guān)鍵詞in、范圍函數(shù)和冒號(hào)。
現(xiàn)在我們考慮寫下循環(huán)的結(jié)構(gòu),馬上讓我們寫一個(gè):
#?使用range()函數(shù)寫下你的第一個(gè)for循環(huán)
for?num?in?range(5):
????print("Value:{}".format(num))
繼續(xù)并運(yùn)行這一代碼塊。結(jié)果將會(huì)輸出“0,1,2,3,4”。這個(gè)循環(huán)對(duì)于5的計(jì)數(shù)是必要的并且列印出每一個(gè)數(shù)字。那么,它又是如何輸出這些數(shù)字的呢?當(dāng)For循環(huán)被創(chuàng)建,range函數(shù)默認(rèn)以0為開頭并將0值分配給暫時(shí)變量num。我們稱每一次循環(huán)為迭代。對(duì)于每一次迭代,一旦代碼塊中的全部代碼運(yùn)行,那么,當(dāng)前迭代就已經(jīng)完成了,并且循環(huán)將再次從頭開始。本次循環(huán)中,暫時(shí)變量num的值默認(rèn)以步長(zhǎng)1遞增。我們的暫時(shí)變量被分配數(shù)值1并且繼續(xù)運(yùn)行for循環(huán)內(nèi)部能夠列印出暫時(shí)變量num值的代碼。代碼將持續(xù)輸出數(shù)字,直到迭代完5次。為了給你一個(gè)每次迭代分配數(shù)字的直觀感受,請(qǐng)看表4-2。
表4-2 對(duì)于每次迭代使用range()函數(shù)分配數(shù)值
| 迭代循環(huán) | 數(shù)值 | 輸出 |
|---|---|---|
| 1 | 0 | Value:0 |
| 2 | 1 | Value:1 |
| 3 | 2 | Value:2 |
| 4 | 3 | Value:3 |
| 5 | 4 | Value:4 |
注意:數(shù)字5沒有被輸出,因?yàn)閞ange()函數(shù)計(jì)數(shù)5次但不包括數(shù)字5。
range()
Range函數(shù)允許我們對(duì)一個(gè)范圍計(jì)數(shù),當(dāng)能夠定義從哪開始和在哪結(jié)束以及我們需要增加多少和減少多少。這就意味著我們可以計(jì)數(shù)每一個(gè)數(shù)字,如果你需要,還可以計(jì)數(shù)每5個(gè)數(shù)字。使用一個(gè)For循環(huán),它能夠讓我們有能力循環(huán)一個(gè)代碼的特定次數(shù)。在之前的例子中,我們看到數(shù)字為5時(shí),列印出5個(gè)數(shù)字。這是因?yàn)閞ange函數(shù)默認(rèn)為從0開始并且每次以步長(zhǎng)1增加。讓我們來看另一個(gè)例子:
#對(duì)于range()函數(shù)提供開始、結(jié)束和步長(zhǎng)
for?num?in?range(2,?10,?2):
?print("Value:{}".format(num))?#?列印全部在2到10范圍內(nèi)間隔為2的所有數(shù)值
繼續(xù)并運(yùn)行這一代碼塊。這次我們?cè)O(shè)定項(xiàng)目從數(shù)字2開始循環(huán),每次間隔2并到10結(jié)束。這時(shí)我們輸出的值就變?yōu)椤?, 4, 6, 8”。
元素循環(huán)
當(dāng)了解到可迭代的數(shù)據(jù)類型如何工作,這就意味著它們有一個(gè)能夠?qū)崿F(xiàn)循環(huán)的元素收集器。我們通過下面這一不同的For循環(huán)來看下:
#?使用關(guān)鍵詞in來列印出變量name中的所有單個(gè)字符
name?=?"John?Smith"
for?letter?in?name:
?print("Value:{}".format(letter))
繼續(xù)并運(yùn)行這一代碼塊。結(jié)果將會(huì)每次輸出變量name中的第一個(gè)字符。記住字符串可以是索引和字母或字符的集合,這將能夠讓字符串進(jìn)行迭代。上面的for循環(huán)將會(huì)迭代每一個(gè)字母并且運(yùn)行代碼塊中輸出每一個(gè)字母/字符的代碼。表4-3展現(xiàn)了這個(gè)迭代循環(huán)輸出的前6個(gè)字符。
表4-3 在字符串的范圍內(nèi)循環(huán)迭代數(shù)值
| 迭代循環(huán) | 字符 | 輸出 |
|---|---|---|
| 1 | J | Value:J |
| 2 | o | Value:o |
| 3 | h | Value:h |
| 4 | n | Value:n |
| 5 | 空格符 | Value: |
| 6 | S | Value:S |
continue語(yǔ)句
現(xiàn)在我們已經(jīng)看到了循環(huán)如何工作,接下來,讓我們討論一些我們使用循環(huán)的重要狀態(tài)。第一個(gè)就是continue語(yǔ)句。一旦continue語(yǔ)句被打破,那么,目前的迭代狀態(tài)就會(huì)停止并回到循環(huán)的最開始的地方。讓我們來看一個(gè)例子:
#?在一個(gè)for循環(huán)中使用continue語(yǔ)句
for?num?in?range(5):
?if?num?==?3:
??continue
?print(num)
繼續(xù)并運(yùn)行這一代碼塊。將會(huì)輸出“0, 1, 2 ,4”,因?yàn)橹挥性趎um等于數(shù)字3的時(shí)候,continue語(yǔ)句才會(huì)被運(yùn)行。一旦這個(gè)狀態(tài)被打破,目前的迭代就會(huì)終止并回到最開始的地方進(jìn)行下一個(gè)循環(huán)。這也意味著在contine下方的所有代碼都不會(huì)被運(yùn)行,所以上面的代碼中沒有列印出數(shù)字3。
break語(yǔ)句
我們使用的最重要的狀態(tài)之一是break語(yǔ)句。它允許我們?cè)谌魏我粋€(gè)地方及時(shí)跳出當(dāng)前的循環(huán)。讓我們來看一個(gè)例子:
#?使用break語(yǔ)句跳出當(dāng)前循環(huán)
for?num?in?range(5):
????if?num?==3:
????????break
????print(num)
繼續(xù)并運(yùn)行這一代碼塊。結(jié)果只會(huì)輸出“0, 1, 2”,這是因?yàn)楫?dāng)num等于3時(shí),觸發(fā)了break語(yǔ)句語(yǔ)句使得循環(huán)直接被終止,break以下的所有代碼都不會(huì)被運(yùn)行。這對(duì)于當(dāng)一個(gè)條件被滿足時(shí)停止循環(huán)是非常有用的。
注意:如果你用了雙層循環(huán),break語(yǔ)句只有終止其所在循環(huán)的代碼塊,另一層循環(huán)將會(huì)繼續(xù)運(yùn)行。這就意味著break語(yǔ)句如果只用于內(nèi)部循環(huán),那么外部循環(huán)仍會(huì)繼續(xù)運(yùn)行。
pass語(yǔ)句
三個(gè)狀態(tài)中的最后一個(gè)是pass語(yǔ)句。pass語(yǔ)句僅僅是一個(gè)占位符,以便讓項(xiàng)目不會(huì)被終止。讓我們來看這樣一個(gè)例子:
#?使用pass語(yǔ)句設(shè)置一個(gè)占位符
for?i?in?range(5):
????#?TODO:?增加打印數(shù)字的代碼
????pass
繼續(xù)并運(yùn)行這一代碼塊。你會(huì)發(fā)現(xiàn)什么也沒有發(fā)生,但這也意味著是一個(gè)好消息。如果你完全使用pass語(yǔ)句,項(xiàng)目將會(huì)終止。因?yàn)樵诖a塊中需要填入其他的代碼來實(shí)現(xiàn)相關(guān)功能。
在以上的簡(jiǎn)單循環(huán)中,我們沒有必要在循環(huán)中寫入這些狀態(tài)代碼。但卻能夠使一個(gè)項(xiàng)目結(jié)構(gòu)清晰,條理分明。
注意:一般使用“TODAO”來為我們將要實(shí)現(xiàn)的功能設(shè)置提醒。
星期二練習(xí)
1.被3整除:寫下一個(gè)for循環(huán),列印出數(shù)字1到10之間能夠被3整除的數(shù)字。
2.只列印出元音字母:定下一個(gè)for循環(huán),列印出用戶輸入的單詞(小寫)中的所有元音字母。例如:
input:"hello"
output:"eo"
今天我們花費(fèi)了些時(shí)間學(xué)習(xí)了關(guān)于for循環(huán)的概念及其如何運(yùn)行。循環(huán)允許我們多次返回運(yùn)行相同的代碼行。
