本文收錄在Python從入門到精通系列文章系列
1. 分支結構
1.1 應用場景
迄今為止,我們寫的Python代碼都是一條一條語句順序執行,這種代碼結構通常稱之為順序結構。然而僅有順序結構並不能解決所有的問題,比如我們設計一個游戲,游戲第一關的通關條件是玩家獲得1000分,那么在完成本局游戲后,我們要根據玩家得到分數來決定究竟是進入第二關,還是告訴玩家“Game Over”,這里就會產生兩個分支,而且這兩個分支只有一個會被執行。類似的場景還有很多,我們將這種結構稱之為“分支結構”或“選擇結構”。
1.2 if語句的使用
在Python中,要構造分支結構可以使用if、elif和else關鍵字。所謂關鍵字就是有特殊含義的單詞,像if和else就是專門用於構造分支結構的關鍵字,很顯然你不能夠使用它作為變量名(事實上,用作其他的標識符也是不可以)。
01-單分支
if username == 'along' and password == '12345':
唯一需要說明的是和C/C++、Java等語言不同,Python中沒有用花括號來構造代碼塊而是使用了縮進的方式來設置代碼的層次結構,如果if條件成立的情況下需要執行多條語句,只要保持多條語句具有相同的縮進就可以了,換句話說連續的代碼如果又保持了相同的縮進那么它們屬於同一個代碼塊,相當於是一個執行的整體。
02-多分支
當然如果要構造出更多的分支,可以使用if…elif…else…結構,例如下面的分段函數求值。
"""
print('f(%.2f) = %.2f' % (x , y))
03-嵌套分支
當然根據實際開發的需要,分支結構是可以嵌套的,例如判斷是否通關以后還要根據你獲得的寶物或者道具的數量對你的表現給出等級(比如點亮兩顆或三顆星星),那么我們就需要在if的內部構造出一個新的分支結構,同理elif和else中也可以再構造新的分支,我們稱之為嵌套的分支結構,也就是說上面的代碼也可以寫成下面的樣子。
print('f(%.2f) = %.2f' % (x, y))
說明: 大家可以自己感受一下這兩種寫法到底是哪一種更好。在之前我們提到的Python之禪中有這么一句話“Flat is better than nested.”,之所以提倡代碼“扁平化”是因為嵌套結構的嵌套層次多了之后會嚴重的影響代碼的可讀性,所以能使用扁平化的結構時就不要使用嵌套。
1.3 練習
練習1:英制單位英寸與公制單位厘米互換。
value = float(input('請輸入長度: '))
if unit == 'in' or unit == '英寸':
print('%f英寸 = %f厘米' % (value, value * 2.54))
elif unit == 'cm' or unit == '厘米':
print('%f厘米 = %f英寸' % (value, value / 2.54))
練習2:百分制成績轉換為等級制成績。
要求:如果輸入的成績在90分以上(含90分)輸出A;80分-90分(不含90分)輸出B;70分-80分(不含80分)輸出C;60分-70分(不含70分)輸出D;60分以下輸出E。
score = float(input('請輸入成績: '))
練習3:輸入三條邊長,如果能構成三角形就計算周長和面積。
判斷輸入的邊長能否構成三角形,如果能則計算出三角形的周長和面積
if a + b > c and a + c > b and b + c > a:
area = (p * (p - a) * (p - b) * (p - c)) ** 0.5
說明: 上面使用的通過邊長計算三角形面積的公式叫做海倫公式。
2. 循環結構
2.1 應用場景
如果在程序中我們需要重復的執行某條或某些指令,例如用程序控制機器人踢足球,如果機器人持球而且還沒有進入射門范圍,那么我們就要一直發出讓機器人向球門方向奔跑的指令。當然你可能已經注意到了,剛才的描述中不僅僅有需要重復的動作,還需要用到上一章講的分支結構。再舉一個簡單的例子,我們要實現一個每隔1秒中在屏幕上打印一次"hello, world"並持續打印一個小時的程序,我們肯定不能夠直接把print('hello, world')這句代碼寫3600遍,如果真的要這樣做,那么編程的工作就太無聊乏味了。因此,我們還需要了解一下循環結構,有了循環結構我們就可以輕松的控制某件事或者某些事重復、重復、再重復的去執行。
在Python中構造循環結構有兩種做法,一種是for-in循環,一種是while循環。
2.2 for-in循環
如果明確的知道循環執行的次數或者要對一個容器進行迭代(后面會講到),那么我們推薦使用for-in循環。
01-案例1
例如下面代碼中計算1~100求和的結果($\displaystyle \sum \limits_{n=1}^{100}n$)。
需要說明的是上面代碼中的range(101)可以用來構造一個從0到100的取值范圍,這樣就可以構造出一個整數的序列並用於循環中,例如:
- range(101)可以產生一個0到100的整數序列。
- range(1, 100)可以產生一個1到99的整數序列。
- range(1, 100, 2)可以產生一個1到99的奇數序列,其中2是步長,即數值序列的增量。
02-案例2
知道了這一點,我們可以用下面的代碼來實現1~100之間的偶數求和。
03-for_in和if結合
也可以通過在循環中使用分支結構的方式來實現相同的功能,代碼如下所示。
2.3 while循環
如果要構造不知道具體循環次數的循環結構,我們推薦使用while循環。while循環通過一個能夠產生或轉換出bool值的表達式來控制循環,表達式的值為True循環繼續,表達式的值為False循環結束。
01-無限循環
下面我們通過一個“猜數字”的小游戲(計算機出一個1~100之間的隨機數,人輸入自己猜的數字,計算機給出對應的提示信息,直到人猜出計算機出的數字)來看看如何使用while循環。
answer = random.randint(1,100)
number = int(input('請輸入一個數字: '))
上面的代碼中使用了break關鍵字來提前終止循環,需要注意的是break只能終止它所在的那個循環,這一點在使用嵌套的循環結構(下面會講到)需要引起注意。除了break之外,還有另一個關鍵字是continue,它可以用來放棄本次循環后續的代碼直接讓循環進入下一輪。
02-嵌套循環
和分支結構一樣,循環結構也是可以嵌套的,也就是說在循環中還可以構造循環結構。下面的例子演示了如何通過嵌套的循環來輸出一個九九乘法表。
print('%d*%d=%d' % (j, i, i * j), end='\t')
2.4 練習
練習1:輸入一個正整數判斷是不是素數。
num = int(input('請輸入一個正整數: '))
練習2:輸入兩個正整數,計算它們的最大公約數和最小公倍數。
for factor in range(x, 0, -1):
if x % factor == 0 and y % factor == 0:
print('%d和%d的最大公約數是%d' % (x, y, factor))
print('%d和%d的最小公倍數是%d' % (x, y, x * y // factor))
練習3:打印如下所示的三角形圖案。
*
**
***
****
*****
*
**
***
****
*****
*
***
*****
*******
*********
如果對linux中的分支和循環結構感興趣的話,請選擇傳送。