本文收錄在Python從入門到精通系列文章系列html
1. 分支結構
1.1 應用場景
迄今爲止,咱們寫的Python代碼都是一條一條語句順序執行,這種代碼結構一般稱之爲順序結構。然而僅有順序結構並不能解決全部的問題,好比咱們設計一個遊戲,遊戲第一關的通關條件是玩家得到1000分,那麼在完成本局遊戲後,咱們要根據玩家獲得分數來決定到底是進入第二關,仍是告訴玩家「Game Over」,這裏就會產生兩個分支,並且這兩個分支只有一個會被執行。相似的場景還有不少,咱們將這種結構稱之爲「分支結構」或「選擇結構」。linux
1.2 if語句的使用
在Python中,要構造分支結構可使用if、elif和else關鍵字。所謂關鍵字就是有特殊含義的單詞,像if和else就是專門用於構造分支結構的關鍵字,很顯然你不可以使用它做爲變量名(事實上,用做其餘的標識符也是不能夠)。編程
01-單分支
下面的例子中演示瞭如何構造一個分支結構。dom
"""函數
用戶身份驗證spa
Version: 0.1設計
Author: along3d
"""code
username = input('請輸入用戶名: ')orm
password = input('請輸入密碼: ')
if username == 'along' and password == '12345':
print('驗證經過')
else:
print('驗證失敗')
惟一須要說明的是和C/C++、Java等語言不一樣,Python中沒有用花括號來構造代碼塊而是使用了縮進的方式來設置代碼的層次結構,若是if條件成立的狀況下須要執行多條語句,只要保持多條語句具備相同的縮進就能夠了,換句話說連續的代碼若是又保持了相同的縮進那麼它們屬於同一個代碼塊,至關因而一個執行的總體。
02-多分支
固然若是要構造出更多的分支,可使用if…elif…else…結構,例以下面的分段函數求值。

"""
分段函數求值
3x - 5 (x > 1)
f(x) = x + 2 (-1 <= x <= 1)
5x + 3 (x < -1)
Version: 0.1
Author: along
"""
x = float(input('請輸入一個數: '))
if x > 1 :
y = 3 * x - 5
elif x >= -1 and x <= 1 :
y = x + 2
else:
y = 5 * x + 3
print('f(%.2f) = %.2f' % (x , y))
03-嵌套分支
固然根據實際開發的須要,分支結構是能夠嵌套的,例如判斷是否通關之後還要根據你得到的寶物或者道具的數量對你的表現給出等級(好比點亮兩顆或三顆星星),那麼咱們就須要在if的內部構造出一個新的分支結構,同理elif和else中也能夠再構造新的分支,咱們稱之爲嵌套的分支結構,也就是說上面的代碼也能夠寫成下面的樣子。
"""
分段函數求值
3x - 5 (x > 1)
f(x) = x + 2 (-1 <= x <= 1)
5x + 3 (x < -1)
Version: 0.1
Author: along
"""
x = float(input('x = '))
if x > 1:
y = 3 * x - 5
else:
if x >= -1:
y = x + 2
else:
y = 5 * x + 3
print('f(%.2f) = %.2f' % (x, y))
說明: 你們能夠本身感覺一下這兩種寫法究竟是哪種更好。在以前咱們提到的Python之禪中有這麼一句話「Flat is better than nested.」,之因此提倡代碼「扁平化」是由於嵌套結構的嵌套層次多了以後會嚴重的影響代碼的可讀性,因此能使用扁平化的結構時就不要使用嵌套。
1.3 練習
練習1:英制單位英寸與公制單位釐米互換。
參考答案:
"""
英制單位英寸和公制單位釐米互換
Version: 0.1
Author: along
"""
value = float(input('請輸入長度: '))
unit = 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))
else:
print('請輸入有效的單位')
練習2:百分制成績轉換爲等級製成績。
要求:若是輸入的成績在90分以上(含90分)輸出A;80分-90分(不含90分)輸出B;70分-80分(不含80分)輸出C;60分-70分(不含70分)輸出D;60分如下輸出E。
參考答案:
"""
百分制成績轉換爲等級製成績
Version: 0.1
Author: along
"""
score = float(input('請輸入成績: '))
if score >= 90:
grade = 'A'
elif score >= 80:
grade = 'B'
elif score >= 70:
grade = 'C'
elif score >= 60:
grade = 'D'
else:
grade = 'E'
print('對應的等級是:', grade)
練習3:輸入三條邊長,若是能構成三角形就計算周長和麪積。
參考答案:
"""
判斷輸入的邊長可否構成三角形,若是能則計算出三角形的周長和麪積
Version: 0.1
Author: along
"""
a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))
if a + b > c and a + c > b and b + c > a:
print('周長: %f' % (a + b + c))
p = (a + b + c) / 2
area = (p * (p - a) * (p - b) * (p - c)) ** 0.5
print('面積: %f' % (area))
else:
print('不能構成三角形')
說明: 上面使用的經過邊長計算三角形面積的公式叫作海倫公式。
注意複習下學生時代的等邊三角形、直角三角形等知識哦,博主當時就忘了。(捂臉~)
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$)。
"""
用for循環實現1~100求和
Version: 0.1
Author: along
"""
sum = 0
for a in range(101):
sum += a
print(sum)
須要說明的是上面代碼中的range(101)能夠用來構造一個從0到100的取值範圍,這樣就能夠構造出一個整數的序列並用於循環中,例如:
- range(101)能夠產生一個0到100的整數序列。
- range(1, 100)能夠產生一個1到99的整數序列。
- range(1, 100, 2)能夠產生一個1到99的奇數序列,其中2是步長,即數值序列的增量。
for b in range(10):
print(b)
for b in range(1,10):
print(b)
for b in range(1,10,2):
print(b)
02-案例2
知道了這一點,咱們能夠用下面的代碼來實現1~100之間的偶數求和。
"""
用for循環實現1~100之間的偶數求和
Version: 0.1
Author: along
"""
sum = 0
for i in range(2,101,2):
sum += i
print(sum)
03-for_in和if結合
也能夠經過在循環中使用分支結構的方式來實現相同的功能,代碼以下所示。
"""
用for循環實現1~100之間的偶數求和
Version: 0.1
Author: along
"""
sum = 0
for i in range(1, 101):
if i % 2 == 0:
sum += i
print(sum)
2.3 while循環
若是要構造不知道具體循環次數的循環結構,咱們推薦使用while循環。while循環經過一個可以產生或轉換出bool值的表達式來控制循環,表達式的值爲True循環繼續,表達式的值爲False循環結束。
01-無限循環
下面咱們經過一個「猜數字」的小遊戲(計算機出一個1~100之間的隨機數,人輸入本身猜的數字,計算機給出對應的提示信息,直到人猜出計算機出的數字)來看看如何使用while循環。
"""
猜數字遊戲
計算機出一個1~100之間的隨機數由人來猜
計算機根據人猜的數字分別給出提示大一點/小一點/猜對了
Version: 0.1
Author: along
"""
import random
answer = random.randint(1,100)
counter = 0
# print(answer)
while True:
counter += 1
number = int(input('請輸入一個數字: '))
if number > answer:
print('小一點')
elif number < answer:
print('大一點')
else:
print('恭喜你,答對了')
break
print('你總共猜了%d次' % counter)
if counter >= 7:
print('你的智商餘額明顯不足')
上面的代碼中使用了break關鍵字來提早終止循環,須要注意的是break只能終止它所在的那個循環,這一點在使用嵌套的循環結構(下面會講到)須要引發注意。除了break以外,還有另外一個關鍵字是continue,它能夠用來放棄本次循環後續的代碼直接讓循環進入下一輪。
02-嵌套循環
和分支結構同樣,循環結構也是能夠嵌套的,也就是說在循環中還能夠構造循環結構。下面的例子演示瞭如何經過嵌套的循環來輸出一個九九乘法表。
"""
輸出乘法口訣表(九九表)
Version: 0.1
Author: along
"""
for i in range(1, 10):
for j in range(1, i + 1):
print('%d*%d=%d' % (j, i, i * j), end='\t')
print()
2.4 練習
練習1:輸入一個正整數判斷是否是素數。
提示:素數指的是隻能被1和自身整除的大於1的整數。
參考答案:
"""
輸入一個正整數判斷它是否是素數
Version: 0.1
Author: along
"""
from math import sqrt
num = int(input('請輸入一個正整數: '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
if num % x == 0:
is_prime = False
break
if is_prime and num != 1:
print('%d是素數' % num)
else:
print('%d不是素數' % num)
練習2:輸入兩個正整數,計算它們的最大公約數和最小公倍數。
參考答案:
"""
輸入兩個正整數計算它們的最大公約數和最小公倍數
Version: 0.1
Author: along
"""
x = int(input('x = '))
y = int(input('y = '))
# 若是x大於y就交換x和y的值
if x > y:
# 經過下面的操做將y的值賦給x, 將x的值賦給y
x, y = y, x
# 從兩個數中較的數開始作遞減的循環
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))
break
練習3:打印以下所示的三角形圖案。
注:先"左"直角、」右「直角、最後等腰三角形
*
**
***
****
*****
*
**
***
****
*****
*
***
*****
*******
*********
參考答案:
"""
打印三角形圖案
Version: 0.1
Author: along
"""
row = int(input('請輸入行數: '))
for i in range(row):
for _ in range(i + 1):
print('*', end='')
print()
for i in range(row):
for j in range(row):
if j < row - i - 1:
print(' ', end='')
else:
print('*', end='')
print()
for i in range(row):
for _ in range(row - i - 1):
print(' ', end='')
for _ in range(2 * i + 1):
print('*', end='')
print()
若是對linux中的分支和循環結構感興趣的話,請選擇傳送。