循環語句
- 導讀
- 一、基本概念
- 1.1 循環語句的執行流程
- 1.2 循環語句的分類
- 二、while語句
- 三、for語句
- 四、break與continue
- 五、死循環
- 六、循環中的else語句
- 七、`range()`函數
- 結語
導讀
大家好,很高興又和大家見面啦!!!
在上一篇內容中我們介紹了條件語句的相關內容,我們先簡單的回顧一下:
在Python中有兩種條件語句——if
語句和match……case
語句。其中if
語句是由關鍵字if、elif、else
引導的特定語句塊,而match……case
是在Python 3.10之后新增的一種條件語句,并且match與case并不是Python中的關鍵字,也就是說我們在沒有使用match……case
語法結構時,是可以定義重名的變量的。
在if語句中有三種形式的分支語句:
- 單分支語句——由
if
引導的條件語句,其語法格式為:
if True: # True代表的是語句中的判斷語句pass # pass——空語句,代表的是if語句塊中的語句
- 雙分支語句——由
if……else
引導的條件語句,其語法格式為:
if True: # if后帶有判斷語句pass
else: # else后不帶判斷語句pass
- 多分支語句——由
if……elif……else
引導的條件語句,其語法格式為:
if 1:pass
elif 2: # elif可以存在多個pass
else:pass
if條件語句還有兩種使用方式:
- if嵌套使用,嵌套格式如下所示:
if True: if True: # 在if語句的任一分支中都能繼續使用if語句# ……passelse:passpass
else:pass
pass
- 省略else,在兩種情況下可以省略else語句:
- 不需要借助
else
語句的判斷邏輯,可以省略else,其語法結構如下:
# 雙分支或多分支語句中不需要使用else的判斷邏輯時可以省略else
if True:pass
pass # 雙分支語句省略else變為單分支語句if 1:pass
elif 2:pass
pass # 三分支語句省略else變為雙分支語句
- 在
if、elif
語句中存在轉向語句的情況,可以省略else,其語法結構如下:
def ignoreElse():# 在函數中if、elif分支中存在轉向語句return,可以省略elseif True:return Truereturn Falsewhile True:# 在循環語句中,if、elif分支中存在轉向語句break、continue,可以省略elseif 1:continueelif 2:breakpass
match……case
語句的用法與C/C++中的開關語句(Switch
語句)的使用方式一致,通過match
作為語句的引導詞,case
作為語句中各分支的引導詞,其語法格式如下所示:
a = 1
match a + 1: # match 引導詞后跟一個表達式case 1: # case 引導詞后可以跟常量、變量、函數、通配符等pass # case 語句塊中的內容都是獨立的語句塊case 2:passcase _: # 通配符_ 可以指代一切內容,相當于defaultpass
但是match……case
語句要比Switch
語句的功能強大:
Switch
引導詞后只能跟一個整型表達式,而match
引導詞后可以跟一個任一類型的表達式Switch
語句中case
引導詞后只能跟整型常量表達式,而match
語句中case
引導詞后可以跟常量、變量、函數……Switch
語句中case
分支是連通的需要借助break
將分支給獨立出來,match
語句中case分支是相互獨立的
復習完了Python中的分支語句的內容,下面我們來看一下Python中的第二類控制語句——循環語句,
一、基本概念
循環語句指的是能夠重復執行同一件事情的語句,是循環結構的具體體現。
1.1 循環語句的執行流程
循環語句的執行流程如下所示:
在循環語句中循環體中可以是空語句,但是下面三條語句是一個循環語句中必不可少的內容:
- 循環對象語句——在循環語句中參與循環的對象
- 循環判斷語句——通過判斷語句的值來決定是否進入循環
- 循環遞進語句——循環對象通過遞進語句逐漸向循環的結束條件靠近
1.2 循環語句的分類
C/C++中有三種循環語句——while
循環語句、for
循環語句以及do……while
循環語句除了這三種循環語句外我們還可以通過goto
語句來實現循環;
但是在Python中,只存在兩種形式的循環語句——while
循環語句和for
循環語句。Python中的循環語句與C/C++中所對應的while
循環語句與for
循環語句有相同點也有不同點,接下來我們就分別來看一下這兩種語言中的while
語句與for
語句之間的差異;
二、while語句
在C/C++中while語句的語法結構如下所示:
int i = 1;//循環對象語句while (i != 100) {//while——語句引導詞//i != 100——循環判斷語句printf("%d\n", i);//循環體語句——循環語句需要執行的具體內容,可以為空語句i++;//循環遞進語句——對象語句根據遞進語句逐漸靠近循環的介紹條件}
在Python中while
語句的語法結構與該結構相似,但還是會有些許區別:
i = 1 # 循環對象語句
while i != 100:# while——語句引導詞# i != 100——循環判斷語句print(i) # 循環體語句——循環語句中需要執行的具體內容i += 1 # 循環遞進語句——循環對象根據遞進語句逐漸靠近循環的介紹條件
while
語句的語法結構在兩種語言中唯一的不同在于判斷語句的表示,在C/C++中,判斷語句會通過圓括號'()'
括起來,但是在Python中,判斷語句則是通過冒號':'
來表示判斷語句的結束。
需要注意的是,在C/C++中如果遞進語句是逐個遞進,那我們可以通過前置'++'/'--'
或者后置'++'/'--'
來完成語句的遞進,但是在Python中舍棄了這類操作符,在自增自減的遞進語句中,可以通過賦值運算符來實現自增自減的操作。
while
語句是循環語句的最基礎的一種語法,語法的使用上也比較簡單,這里就不再繼續贅述,下面我們繼續來看一下for語句在兩種語言中的異同點;
三、for語句
在while
語句中,語句的循環對象位于語句的外部,循環遞進語句則位于循環體中,它們三者在位置上呈現的是一種上下關系,這樣就容易出現一種情況——當循環對象語句與while引導詞中間的語句內容過多或者循環體中的語句比較多時,導致循環對象語句、判斷語句以及循環遞進語句間隔太遠。
在這種情況下如果在循環語句中出現問題時,我們想要修改這三者中的其中之一,則會需要花費大量的時間去一一尋找這三條語句。因此如果我們在編寫循環語句時,需要盡可能的讓這三條語句靠近一些。
在計算機語言中,for
循環語句就很好的彌補了while
語句中的這個問題,下面我們先來看一下C/C++中的for語句的語法結構,如下所示:
for (int i = 1; i != 100; i++) {printf("%d\n", i);}
可以看到,在C/C++的for
語句中,循環對象語句、循環判斷語句、循環遞進語句都位于引導詞for
后面的圓括號內'()'
,這樣就能在我們需要修改這三者中的任一一條語句時,就能通過循環語句引導詞for
很輕松的找到這三條語句。
在Python中,for語句的語法結構與C/C++的for語句的語法結構有很大的不同,如下所示:
for i in range(1, 101):print(i)
# i——循環對象
# in——成員運算符
# range()——可迭代對象,也可以是字符串、元組、列表……
在Python中,for循環語句的判斷語句與遞進語句都被整合到了可迭代對象中。可迭代對象指的是一種特殊的變量~內部包含了很多其他的值。循環體在執行時,可以通過成員運算符'in'
將可迭代對象中的值一個一個的取出來并存放在循環對象變量中。
這里展示的可迭代對象range()
,是一個可以依次獲取參數區間內整數的內建函數,該函數的區間為前閉后開區間,也就是說對于區間1~101
我們通過成員運算符'in'
可以從函數中獲取到的內容為1~100
的所有整數。
在循環語句中我們還可以通過轉向語句來控制循環體語句的執行邏輯,在C/C++中循環體中的轉向語句有兩種——break
與continue
,在Python中,這兩種轉向語句同樣適用,下面我們就來看一下Python中的break
與continue
的用法
四、break與continue
在循環語句中,break
可以用來立即結束循環并跳出循環,continue可以用來立即結束當前循環開始進入下一次循環,具體用法如下所示:
從測試中可以看到,通過for循環語句我們完成了從1到100 的打印,當在循環中加入break
與continue
之后,循環的執行邏輯發生了變化:
- 在
i == 10
時,第一個if語句能夠正常執行,也就是說此時循環體中執行的是轉向與continue
,可以看到continue
后的print
語句并沒有執行,而是直接進入了下一次循環打印i == 11
; - 在
i == 20
時,在完成打印后,第二個if語句能夠正常執行,也就是說此時循環體中執行的是轉向語句break
,可以看到在執行完break
后,循環并未繼續執行,而是執行了循環外的print
語句;
這個例子很好的說明了這兩個轉向語句在循環中的用法:
continue
——用于結束當前循環,continue后的語句不再執行,程序立即進入下一次循環break
——用于結束循環,程序直接跳出循環,執行循環外的語句
五、死循環
死循環也就是無線循環——循環無法停止,會一直運行。當我們在寫程序時,最怕的就是遇到死循環,會導致死循環的原因主要有以下幾點:
- 判斷語句的值永遠為真
- 缺少遞進語句導致判斷語句恒成立
- 遞進語句的遞進方向錯誤,導致循環對象逐漸遠離循環的結束條件
下面我們通過一個最簡單的死循環來認識什么是死循環:
可以看到此時程序已經運行到了i==1622878
任然未停止運行,之所以無法停止,正是因為在該循環中判斷條件一直成立,且循環體內沒有轉向語句break
來結束循環,因此循環進入了死循環。
那是不是說所有的死循環都是不合理的呢?
實際上并不是這樣,比如一款游戲的運行,當我們在結束一句游戲后,如果游戲就直接退出了,那我們想要開啟下一句游戲,只能夠重新啟動該游戲,顯然這種設計是不合理的,因此我們就可以設置死循環,并通過轉向語句來控制循環的結局,如下所示:
可以看到,同樣的代碼,當我們在循環體中添加了轉向語句后循環變不再是死循環了。
設想一下,如果我們是將條件語句的判斷條件改為輸入某個值,或者檢測鍵盤按下了某個按鍵,或者鼠標點擊了某個按鍵,才會執行轉向語句,這樣我們是不是就能夠保證即使一局游戲結束后,不會第一時間退出程序,而是會繼續運行了。
因此合理的利用死循環和轉向語句,能夠幫助我們實現更多的操作。
六、循環中的else語句
在Python中對于循環語句而言,新增了一個語法——else語句:
- while……else語句
- for……else語句
這種語法就是在雙分支語句的基礎上將if語句替換成了循環語句,如下所示:
看到這里,有朋友就會好奇了,這跟不加else有什么區別?不一樣的都是在不滿足循環條件時運行循環體外的語句嗎?
如果我們只是看這個測試代碼,確實,循環語句后加一個else語句與不加else語句并無區別,但是當我們在循環體中加入了轉向語句后,我們就能知道他們的區別在哪里了,如下所示:
從測試結果中大家應該能夠明白在循環語句后加了else
語句與不加else
語句的區別了。
循環……else
語句就像雙分支條件語句一樣,它們是一個整體,對于轉向語句break
與continue
而言,它們的作用是用來結束循環語句,因此,當循環體中出現轉向語句時,會直接結束整個循環,包括else語句。
下面我們通過一個例子來說明該語法的運用場景:
可以看到實現同樣功能的代碼,第一次加了else,第二次沒有加else,但是輸出的結果卻不相同,第二次比第一次多輸出了一行信息。
導致這種錯誤的原因是因為對于該功能而言,我們在實際的運行中只會嘗試兩種結果——是質數與不是質數,也就是說這兩種判斷結果我們只需要輸出其中之一。
- 當我們通過
else
語句來控制時,能完美的實現二者輸出其一的操作; - 但是當我們不加
else
時,第二個print語句屬于第一層循環的循環體中的內容,因此第二層循環的循環體中的break語句無法對其生效,所以會導致進行重復輸出的情況。
也就是說這種語法結構比較適合需要根據判斷條件進行不同輸出的結果,并且其中一種判斷條件需要通過循環來實現。
七、range()
函數
range()函數作為Python中的內置函數,它的作用是生成一組數字序列,并將其以可迭代的對象進行返回,其返回值的類型為對象類型。該函數語法如下所示:
range(stop)
range(start, stop[, step])
函數中的參數的含義依次為:
- start: 計數從 start 開始。默認是從 0 開始。例如 range(5) 等價于 range(0, 5)
- stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是 [0, 1, 2, 3, 4] 沒有 5
- step:步長,默認為 1。例如:range(0, 5) 等價于 range(0, 5, 1)
這里我們需要了解的是函數的第三個參數——步長(step
)。
所謂的步長,我們可以理解為對象語句遞進的方式,函數默認的步長為1,其對象語句會依次增加1,當步長為n時,其對象語句依次增加n,如下所示:
下面我們來簡單總結一下range函數的用法:
- range函數可以用于生成一組數字序列,并將其作為可迭代對象返回,返回值的類型為對象類型;
- range中的三個參數分別是序列開始值、序列結束值以及序列步長;
- 開始值默認為0,序列步長默認為1
- 當步長為負數時,傳入的序列開始值需要大于結束值
結語
今天的內容到這里就全部結束了,在下一篇內容中我們將介紹《Python中的函數》,大家記得關注哦!如果大家喜歡博主的內容,可以點贊、收藏加評論支持一下博主,當然也可以將博主的內容轉發給你身邊需要的朋友。最后感謝各位朋友的支持,咱們下一篇再見!!!