python流程控制詳細(xì)介紹
前言:
經(jīng)過(guò)簡(jiǎn)單的了解python基本語(yǔ)法和使用后,發(fā)現(xiàn)其都是一些順序執(zhí)行語(yǔ)句,也就是依次執(zhí)行,沒有任何的分支,循環(huán),也不會(huì)返回到以前的執(zhí)行語(yǔ)句-流程控制。在實(shí)際使用中,當(dāng)然不可避免使用到流程控制語(yǔ)句,但其都要由邏輯表達(dá)式進(jìn)行控制,因此先行介紹一下布爾邏輯。
1. 布爾邏輯
什么是布爾邏輯?
簡(jiǎn)單來(lái)講,布爾邏輯就是操作真值。相比大多數(shù)編程語(yǔ)言一樣,Python也使用布爾邏輯來(lái)做決策判斷,使用True和False表示。一般經(jīng)常使用的有4個(gè)布爾邏輯運(yùn)算符,not、and、or、==。在Python語(yǔ)言的使用中,幾乎所有判斷決策都可以使用這四個(gè)邏輯運(yùn)算符表示。首先我們計(jì)算布爾邏輯可能產(chǎn)生的值,假設(shè)a,b兩個(gè)變量,那么對(duì)于它們來(lái)講就有四個(gè)非真即假的組合,如下表:F表示FALSE,T表示TRUE
a | b | a==b | a!=b | a and b | a or b | not b |
F | F | T | F | F | F | T |
F | T | F | T | F | T | T |
T | F | F | T | F | T | F |
T | T | T | F | T | T | F |
通過(guò)代碼直觀感受下布爾邏輯計(jì)算的結(jié)果:
==(邏輯相等), 當(dāng) a 和 b 包含的真 值相同,即都為 True 或都為 False 時(shí),表達(dá) 式 a==b 的結(jié)果才為 True

!= (邏輯不等)


有計(jì)算的地方,就會(huì)涉及到計(jì)算的優(yōu)先級(jí),對(duì)于布爾運(yùn)算的優(yōu)先級(jí),規(guī)則如下
優(yōu)先級(jí)由高到低:
a==b、a != b、not a、a and b、a or b
舉個(gè)例子: not True and False or True,執(zhí)行結(jié)果如下圖True。可以看到其執(zhí)行順序?yàn)閚ot True,在計(jì)算(not Ture) and False,最后是or,那么我們來(lái)簡(jiǎn)化下,這個(gè)求值結(jié)果是不是就是計(jì)算 False and False or True 。這也算是優(yōu)化的一小步!當(dāng)然,我們根據(jù)上面的表在考慮一下:and的優(yōu)先級(jí)高于or,故而計(jì)算False and False 等價(jià)于 False。那么最后的表達(dá)式也就是計(jì)算 False or True。

所以,當(dāng)需要使用比較復(fù)雜的布爾邏輯表達(dá)式的時(shí)候,需要特別注意括號(hào)的使用!
- 了解了布爾邏輯的規(guī)則,
Python同其它語(yǔ)言一樣,使用了一定的方法,提高了布爾表達(dá)式的計(jì)算速度,這個(gè)方法被稱為:短路求值。 - 有興趣的話可以自行深入了解下實(shí)現(xiàn)原理
運(yùn)算規(guī)則 | 運(yùn)算結(jié)果 |
a or b | 如果 a 為 False,結(jié)果為 b,否則結(jié)果為 a |
a and b | 如果 a 為 False,結(jié)果為 a,否則結(jié)果為 b |
這個(gè)邏輯表達(dá)式是Python使用者經(jīng)常用到的,直觀來(lái)講,以 True or Any 為例,不論這個(gè)Any為什么值,其表達(dá)式結(jié)果都是True。同理,False and Any 的結(jié)果為False。但切記,邏輯好用的同時(shí)也會(huì)對(duì)代碼產(chǎn)生可讀性不好的體驗(yàn)感,可以用下面提到的if條件語(yǔ)句來(lái)實(shí)現(xiàn)運(yùn)算規(guī)則體驗(yàn)一下!
1.1 條件控制語(yǔ)句-if
if-條件控制語(yǔ)句,它的作用是使得代碼程序在執(zhí)行的時(shí)候按照一定的條件進(jìn)行決策改變。對(duì)于文本處理、腳本開發(fā)、網(wǎng)站開發(fā)、數(shù)據(jù)科學(xué)等各個(gè)方向的研究實(shí)現(xiàn),幾乎都會(huì)使用到if語(yǔ)句。
1.2 if/else 語(yǔ)句
假設(shè)有個(gè)簡(jiǎn)單的小需求:開機(jī)需要用戶輸入用戶名和密碼,如果正確則讓其登錄,如果不正確告知密碼不正確。
if __name__ == "__main__":
while True:
scan_user = input('please input your name: ')
scan_pass = input('please input your passwd: ')
if scan_pass == 'if/else':
print('Logging on now!')
else:
print('your passwd is incorrect!!')
print('我不在if/else語(yǔ)句中!')
執(zhí)行結(jié)果:

可以看到,如果變量scan_pass指向的字符串為"if/else",就會(huì)顯示登錄成功,如果不是,變量為任何值都會(huì)提示密碼錯(cuò)誤。
由此,我們來(lái)畫一個(gè)if/else的基本語(yǔ)句結(jié)構(gòu):

在Python的使用中,通常會(huì)將 : 用作 if 語(yǔ)句頭、循環(huán)頭和函數(shù)頭的結(jié)束標(biāo)記。并且,其中的代碼塊可以包含任意數(shù)量的Python語(yǔ)句和其它if語(yǔ)句。在Python編程中,同樣需要縮進(jìn)代碼塊,不過(guò)與其它語(yǔ)言為了美觀相比,Python必須使用縮進(jìn)來(lái)表示一段代碼塊的所屬。如上面那段示例的最后一行代碼,并不在else語(yǔ)句中。
1.3 if/elif 語(yǔ)句
if/elif 語(yǔ)句是if/else語(yǔ)句的擴(kuò)充,很多邏輯的實(shí)現(xiàn)不會(huì)僅僅只包含兩個(gè)條件,它可能包含多個(gè)條件。比如某商場(chǎng)設(shè)定的一些優(yōu)惠條件:滿200打八折,滿400打六折,滿800超出400的部分打五折等等。
這樣的代碼實(shí)現(xiàn)如下:
if __name__ == "__main__":
while True:
consumer = int(input('請(qǐng)輸入您的消費(fèi)金額:'))
money = 0
if 200 <= consumer < 400:
money = consumer * 0.8
print('您的消費(fèi)金額是:' + str(money))
elif 400 <= consumer < 800:
money = consumer * 0.6
print('您的消費(fèi)金額是:' + str(money))
elif consumer >= 800:
money = 400 * 0.6 + (consumer - 400) * 0.5
print('您的消費(fèi)金額是:' + str(money))

當(dāng)輸入消費(fèi)金額之后,程序進(jìn)入if/elif 語(yǔ)句,按照指定順序依次進(jìn)行判斷,首先對(duì)消費(fèi)金額進(jìn)行大于200并小于400的判斷,然后計(jì)算出此次消費(fèi)金額,跳出語(yǔ)句,以此類推。需要注意的是: elif 是 else if 的縮寫,編寫時(shí)可以隨意使用,但是每個(gè)代碼塊的縮進(jìn)必須相同。
if/else 語(yǔ)句還有一個(gè)比較簡(jiǎn)單的寫法,是一種有人喜歡有人不喜歡的寫法。
通常如下:主要看response那一行代碼,這行代碼就等價(jià)于下面的if/else代碼塊。
if __name__ == "__main__":
color = input('請(qǐng)問(wèn)您最喜歡什么顏色?')
response = 'blue' if color == 'red' else 'black'
print(response)
if __name__ == "__main__":
color = input('請(qǐng)問(wèn)您最喜歡什么顏色?')
if color == 'red':
like = 'blue'
else:
like = 'black'
條件表達(dá)式通常比等價(jià)的 if/else 語(yǔ)句簡(jiǎn)短,但并非總是與 if/else 語(yǔ)句一樣靈活和易于理解。一般而言,僅當(dāng)條件表達(dá)式可讓代碼更簡(jiǎn)單時(shí)才會(huì)使用。
2 循環(huán)控制語(yǔ)句
上面的條件控制主要決策執(zhí)行哪一段代碼塊,在編寫代碼時(shí)也會(huì)涉及到重復(fù)的執(zhí)行某一段代碼,這時(shí)就會(huì)用到循環(huán)控制語(yǔ)句。在每種語(yǔ)言的使用中,通常會(huì)用到的就是for循環(huán)和while循環(huán)兩種循環(huán)控制語(yǔ)句。此處加個(gè)小說(shuō)明:無(wú)論老師講課還是日常使用中,經(jīng)常會(huì)用到變量i,因?yàn)樗莍ndex的縮寫。當(dāng)開始使用循環(huán)語(yǔ)句的時(shí)候, 通常將 j 和 k 用作其他循環(huán)變量名。
2.1 循環(huán)控制之for
假設(shè)我們需要在屏幕上依次打印數(shù)字0~9,此時(shí)我們可以使用循環(huán)語(yǔ)句實(shí)現(xiàn),如下:for循環(huán)的第1行被稱為for循環(huán)頭。for 循環(huán)總是以關(guān)鍵字for打頭,接下來(lái)是循環(huán)變量(這里為 i),然后是關(guān)鍵字 in。關(guān)鍵字 in 后面通常(但并非總是)是 range(n) 和結(jié)束符號(hào) : 。for 循環(huán)重復(fù)執(zhí)行循環(huán)體(循環(huán)頭后面的語(yǔ)句塊)n 次。
if __name__ == "__main__":
for i in range(10):
print(i)

每次執(zhí)行循環(huán)時(shí),循環(huán)變量都被設(shè)置為下一個(gè)值。默認(rèn)情況下,初始值為 0,并逐步遞增到 n-1(而不是 n)。
如果要修改循環(huán)的初始值,可在 range 中添加初始值:
if __name__ == "__main__":
for i in range(1,10):
print(i)
#或者給變量i+1
for i in range(10):
print(i + 1)

如果需要按照相反的順序打印,則可以按照以下兩個(gè)方法:
if __name__ == "__main__":
for i in range(10, 0, -1):
print(i)
for i in range(10):
print(10 - i)

for循環(huán)當(dāng)然不止運(yùn)用于循環(huán)打印,在實(shí)際編程中,根據(jù)不同的需要,其可以適用于任何類型的迭代中。例如,使用for循環(huán)讀取文本的行數(shù)據(jù)或者向文本中寫入數(shù)據(jù)等等。
2.2 循環(huán)控制之while
對(duì)于while循環(huán),在本人的使用中,對(duì)比for,感受到for循環(huán)更容易使用,但其卻沒有while循環(huán)的靈活性。同樣,我們循環(huán)打印一些數(shù)字:
if __name__ == "__main__":
i = 0
while i < 10:
print(i)
i = i + 1
該代碼與for循環(huán)的執(zhí)行結(jié)果是一樣的,但是直觀來(lái)看,while循環(huán)的代碼塊要稍微復(fù)雜一些。while 循環(huán)本身以關(guān)鍵字 while 打頭,這 一行被稱為 while 循環(huán)頭,而它后面縮進(jìn)的代碼被稱為 while 循環(huán)體。以這個(gè)例子我們畫一個(gè)while循環(huán)的執(zhí)行流程圖,
如下:

可以總結(jié)一下, while 循環(huán)的控制流程:
1.Python 檢查循環(huán)條件為 True 還是 False(就是之前所闡述的布爾表達(dá)式),
- 如 果為 True,就執(zhí)行循環(huán)體;
- 如果為 False,就跳過(guò)循環(huán)體(即跳出循環(huán))并執(zhí)行后面的語(yǔ)句。
2. 在條件為 True 并執(zhí)行循環(huán)體后,Python 再次檢查條件。只要循環(huán)條件為 True,Python 就不斷執(zhí)行循環(huán)體,直到跳出。
示例程序的第 1 行為 i = 0,在循環(huán)語(yǔ)境下,i=0被稱為初始化語(yǔ)句。與 for 循環(huán)那樣自動(dòng)初始化循環(huán)變量不同,由編程者負(fù)責(zé)給 while 循環(huán)使用的變量指定初始值。而循環(huán)體的最后一行為 i = i + 1,隨著循環(huán)的進(jìn)行,i 的值不斷遞增,確保循環(huán)終將終止。在 while 循環(huán)中,這一行被稱為遞增語(yǔ)句,在本例中作用是讓循環(huán)變量進(jìn)行遞增。
這樣看來(lái),for循環(huán)不需要編程者去定義初始化語(yǔ)句和遞增語(yǔ)句,但是在開發(fā)中,使用者通常會(huì)發(fā)現(xiàn)這些語(yǔ)句一旦不注意則會(huì)導(dǎo)致bug出現(xiàn),這也是為什么說(shuō)while循環(huán)要比f(wàn)or循環(huán)更加靈活。
while循環(huán)在使用測(cè)試時(shí),通常還有一個(gè)特性便是無(wú)線循環(huán)執(zhí)行,實(shí)現(xiàn)只需要一行代碼while true,只要使用,那么其循環(huán)體便會(huì)持續(xù)執(zhí)行下去。在實(shí)際生產(chǎn)中,最好使用for循環(huán)來(lái)代替這種用法!后續(xù)也會(huì)闡述一些跳出循環(huán)的語(yǔ)句來(lái)避免。
3 for vs while
使用三個(gè)簡(jiǎn)單的小例子來(lái)看下for循環(huán)和while循環(huán)是如何解決相同的問(wèn)題,同時(shí)體會(huì)一下二者的不同,這可以讓我們更好的應(yīng)用在實(shí)際的編程中去。
3.1 對(duì)輸入的數(shù)字求和
本案例輸入一些數(shù)字,然后求出這些數(shù)字的總和。
for循環(huán)實(shí)現(xiàn):
if __name__ == "__main__":
num = int(input('需要計(jì)算多少個(gè)數(shù)字:'))
sum = 0
for i in range(num):
n = input('輸入第' + str(i + 1) + '個(gè)數(shù)字:')
sum = sum + int(n)
print('輸入的數(shù)字總和為:' + str(sum))
while循環(huán)實(shí)現(xiàn):
num = int(input('需要計(jì)算多少個(gè)數(shù)字:'))
sum = 0
i = 1
while i <= num:
n = input('輸入第' + str(i + 1) + '個(gè)數(shù)字:')
sum = sum + int(n)
i = i + 1
print('輸入的數(shù)字總和為:' + str(sum))
二者實(shí)現(xiàn)的結(jié)果如下:

案例中的程序都是將輸入的數(shù)字固定在整數(shù),如果用戶輸入的是浮點(diǎn)數(shù),調(diào)用 int(s) 時(shí)將會(huì)報(bào)錯(cuò)。當(dāng)然,要支持用戶輸入浮點(diǎn)數(shù)很容易, 只需將int(s)改為float(s)即可。
3.2 未知個(gè)數(shù)字的求和
這個(gè)案例需要注意,上面的案例無(wú)論使用for循環(huán)或者while循環(huán)都可以實(shí)現(xiàn)需求,但是這個(gè)案例可以體驗(yàn)一下for循環(huán)無(wú)法處理,但是while循環(huán)適用的情況。需求:假設(shè)輸入一系列數(shù)字,同樣計(jì)算總和,但是并不知道會(huì)輸入多少個(gè)數(shù)字,并且在輸入結(jié)束時(shí),我們以done為標(biāo)識(shí)。
if __name__ == "__main__":
num = input('輸入完成標(biāo)識(shí)(or "done"):')
sum = 0
while num != 'done':
i = int(num)
sum = sum + i
num = input('輸入完成標(biāo)識(shí)(or "done"):')
print('輸入的數(shù)字總和為:' + str(sum))

試想一下,我們不知道會(huì)輸入多少個(gè)數(shù)字,而是直到輸入標(biāo)識(shí)字符才會(huì)計(jì)算求和。這個(gè)代碼塊預(yù)先并不知道循環(huán)體執(zhí)行多少次。
注意代碼中的一些地方:
- 1. 在循環(huán)體內(nèi),語(yǔ)句的排列順序至關(guān)重要。如果循環(huán)條件為 True,就說(shuō)明 num 不是 'done',所以假定它是一個(gè)整數(shù)。 因此,我們可以將它轉(zhuǎn)換為整數(shù),將其與總和相加。
- 2. 必須在兩個(gè)地方調(diào)用 input:循環(huán)前面及循環(huán)體內(nèi),因?yàn)檠h(huán)條件判斷輸入是數(shù)字還是 'done'。
- 3. 不再需要計(jì)數(shù)器變量 i。在上一個(gè)計(jì)算總和的示例中,i 用于記錄輸入了多少個(gè)數(shù)字。在日常使用中,程序包含的變量越少,越容易理解、調(diào)試和擴(kuò)展。
3.3 階乘計(jì)算
最后在體驗(yàn)一把二者都可以使用的情況:計(jì)算數(shù)字的階乘,即1*2*3*4*...*n;
if __name__ == "__main__":
num = int(input('輸入一個(gè)大于0的整數(shù): '))
k = 1;
for i in range(2,num+1):
k = k * i
print(str(num) + '的階乘值:' + str(k))
num = int(input('輸入一個(gè)大于0的整數(shù): '))
k = 1;
i = 2;
while i<=num:
k = k * i;
i = i + 1
print(str(num) + '的階乘值:' + str(k))

由于python對(duì)整數(shù)的最大取值沒有限制,所以可以使用python來(lái)計(jì)算很大的階乘值。
到此這篇關(guān)于python流程控制的文章就介紹到這了,更多相關(guān)python流程控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python ndarray數(shù)組對(duì)象特點(diǎn)及實(shí)例分享
在本篇文章里小編給大家分享的是一篇關(guān)于python ndarray數(shù)組對(duì)象特點(diǎn)及實(shí)例相關(guān)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2021-10-10
python實(shí)現(xiàn)域名系統(tǒng)(DNS)正向查詢的方法
這篇文章主要介紹了python實(shí)現(xiàn)域名系統(tǒng)(DNS)正向查詢的方法,結(jié)合實(shí)例形式分析了Python使用socket模塊下getaddrinfo方法進(jìn)行域名查詢的具體技巧,需要的朋友可以參考下2016-04-04
Python使用pip安裝報(bào)錯(cuò):is not a supported wheel on this platform的解決
這篇文章主要介紹了Python使用pip安裝報(bào)錯(cuò):is not a supported wheel on this platform的解決方法,結(jié)合實(shí)例形式分析了在安裝版本正確的情況下pip安裝報(bào)錯(cuò)的原因與相應(yīng)的解決方法,需要的朋友可以參考下2018-01-01
解決pytorch-yolov3 train 報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決pytorch-yolov3 train 報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
淺談keras中自定義二分類任務(wù)評(píng)價(jià)指標(biāo)metrics的方法以及代碼
這篇文章主要介紹了淺談keras中自定義二分類任務(wù)評(píng)價(jià)指標(biāo)metrics的方法以及代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
PyCharm刷新項(xiàng)目(文件)目錄的實(shí)現(xiàn)
今天小編就為大家分享一篇PyCharm刷新項(xiàng)目(文件)目錄的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02

