一、流程控制
流程控制就是用來控制程式執行中各語句執行順序的語句。基本的流程結構為:順序結構,分支結構(或稱選擇結構),迴圈結構。
- 順序結構:程式自上到下執行,中間沒有任何判斷和跳轉;
- 分支結構:根據條件,選擇性的執行某段程式碼,有 if……else 和 switch……case 兩種分支語句;
- 迴圈結構:根據迴圈條件,重複性的執行某段程式碼,有 while、do……while、for 三種迴圈語句;
二、順序結構
順序結構 是 Python 程式預設的執行流程,按照程式碼的先後順序,從上到下依次執行,中間沒有任何的判斷和跳轉。
print("你好,世界!")
print("Hello world!")
三、分支結構
選擇語句 也被稱為 分支語句,它透過給定的條件進行判斷,從而決定執行兩個或者多個分支中哪一隻。因此,在編寫選擇語句之前,應該首先明確判斷條件是什麼,並確定判斷結果為“真”或“假”時應分別執行什麼樣的操作/演算法。在 Python 語言中提供了if 語句用來實現分支結構。
3.1、if語句的單分支結構
Python 中使用 if 關鍵字來組成選擇語句。
if 關係表示式:
程式碼塊
執行流程:
- 首先計算 關係表示式 的值
- 如果關係表示式的值為 真 就 執行語句體
- 如果關係表示式的值為 假 就 不執行語句體
- 繼續執行後面的其它語句
程式碼塊中儲存著一組程式碼,同一個程式碼塊中的程式碼,要都執行要麼都不執行。程式碼塊就是一種為程式碼分組的機制。程式碼塊以縮排開始,直到程式碼恢復到之前的縮排級別時結束。
num = int(input("請輸入一個數:"))
if num > 10:
print("你輸入的數比10大")
print("你輸入的數字大於10")
print("你輸入的數字是:", num)
使用 if 語句時,如果只有一條語句,語句塊可以直接寫到 “:” 的右側。
num = int(input("請輸入一個數:"))
if num > 10: print("你輸入的數比10大")
print("你輸入的數字是:", num)
在 Python 中,if 語句可以使用邏輯運算子來連線多個條件,如果希望所有條件同時滿足,則需要使用 and,如果希望只要有一個條件滿足即可,則需要使用 or。
num = int(input("請輸入一個數:"))
if num < 10 or num > 20:
print("你輸入的數不在10和20之間")
print("你輸入的數字是:", num)
print()
num = int(input("請輸入一個數:"))
if 10 <= num <= 20:
print("你輸入的數在10和20之間")
print("你輸入的數字是:", num)
Python 對程式碼的縮排要求非常嚴格,同一級別的程式碼塊的縮排量必須相同。如果不採用合理的程式碼縮排,將丟擲 SyntaxError 異常;
在 if 結構裡面還可以巢狀 if 結構,程式碼塊是可以巢狀的,每增加一個縮排級別,程式碼塊就低一級;
3.2、if語句的雙分支結構
if 關係表示式:
程式碼塊1
else:
程式碼塊2
執行流程:
- 首先計算 關係表示式 的值
- 如果關係表示式的值為 真 就執行 語句體 1
- 如果關係表示式的值為 假 就執行 語句體 2
- 繼續執行後面的其它語句
num = int(input("請輸入一個數:"))
if num > 10:
print("你輸入的數比10大")
else:
print("你輸入的數不大於10")
print("你輸入的數字是:", num)
if..else 語句可以使用關係表示式進行簡化。
語句1 if 條件表示式 else 語句2
它的執行流程如下:
- 條件運算子在執行時,會先對條件表示式進行求值判斷
- 如果判斷結果為 True,則執行語句 1,並返回執行結果
- 如果判斷結果為 False,則執行語句 2,並返回執行結果
num = int(input("請輸入一個數:"))
print("你輸入的數比10大") if num > 10 else print("你輸入的數不大於10")
3.3、if語句的多分支結構
if 關係表示式1:
程式碼塊1;
elif 關係表示式2:
程式碼塊2;
……
else:
程式碼塊n+1;
執行流程:
- 首先計算 關係表示式 1 的值
- 如果為 真 就執行 語句體 1;如果為 假 就計算 關係表示式 2 的值
- 如果為 真 就執行 語句體 2;如果為 假 就計算 關係表示式 3 的值
- ……
- 如果 所有的關係表示式 結果都為 假,就執行 else 子句中的 語句體 n+1
- 繼續執行其它語句
num = int(input("請輸入一個數:"))
if num > 10:
print("你輸入的數比10大")
elif num < 10:
print("你輸入的數比10小")
else:
print("你輸入的數等於10")
else 是一條包羅永珍的語句,只要不滿足任何 if 和 elif 中的條件測試,其中的程式碼就會執行。這可能引入無效甚至惡意的資料。如果知道最終要測試的條件,應考慮使用一個 elif 程式碼塊來代替 else 程式碼塊。這樣就可以肯定,僅當滿足相應的條件時,程式碼才會執行。
num = int(input("請輸入一個數:"))
if num > 10:
print("你輸入的數比10大")
elif num < 10:
print("你輸入的數比10小")
elif num == 10:
print("你輸入的數等於10")
else 結構是可選的;
if-elif-else 結構中最多隻會有一個程式碼塊會執行;
如果多個條件表示式之間是“互斥”關係,哪個判斷和執行語句宣告在上面還是下面,無所謂;
如果多個條件表示式之間有“交集”關係,需根據實際情況,考慮清除應該將哪個結構寫在上面;
如果多個條件表示式之間有 “包含”關係,通常情況下,需要 將範圍小的宣告在範圍大的上面。否則,範圍小的沒機會執行;
四、迴圈結構
迴圈就是重複的做某件事情;它具有明確的開始和停止標誌;一組被重複執行的語句稱之為 迴圈體,能否繼續執行,取決於 迴圈的終止條件。在 Python 中迴圈分為 for迴圈、while迴圈;迴圈結構具有以下四個組成部分:
- 初始化部分(init_statement)
- 迴圈條件部分(test_exp)
- 迴圈體部分(body_statement)
- 迭代部分(alter_statement)
通常情況下,迴圈結構都是因為②中迴圈條件返回false;
4.1、for迴圈
for 迴圈時一個計次迴圈,通常適用於列舉或遍歷序列,以及迭代物件中的元素。一般應用在迴圈物件已知的情況下。
for 迭代變數 in 可迭代物件:
語句塊
else:
程式碼塊
其中,迭代變數用於儲存讀取出的值;對可迭代物件可以是任何有序的序列物件,如列表、元組、字串等;
執行流程:
- 判斷可迭代物件中是否還有項
- 如果 沒有,則迴圈結束,繼續執行後面的其它語句
- 如果 有,則 執行迴圈體語句
- 取 下一項
- 回到 ① 繼續執行 條件判斷語句
- 如果迴圈正常結束(即沒有被 break 打斷的情況下),則執行 else 中的程式碼塊
for element in "Sakura":
print(element,end="")
else:
print("\n迴圈執行完畢")
print("\n其它語句開始執行")
for 迴圈還可以和 range() 函式搭配使用,range() 可以用來生成一個自然數的序列,它有三個引數,第一個引數是 起始位置,可以省略,預設是 0,第二個引數是 結束位置,第三個引數是 步長,也可以省略,預設是 1。
for i in range(0,10,2):
print(i)
步長可以為負,用來實現倒數計時的效果。
for i in range(5,-1,-1):
print(i)
4.2、while迴圈
①初始化條件
while ②迴圈條件:
③迴圈體
④迭代條件
else:
程式碼塊
執行流程:
- 執行 初始化語句
- 執行 條件判斷語句,看其結果是 真 還是 假
- 如果是 假,迴圈結束,如果迴圈有 else ,則執行 else 裡面的程式碼塊,然後繼續執行後面的其它語句
- 如果是 真,執行迴圈體語句
- 執行 條件控制語句
- 回到②繼續執行 條件判斷語句
- 如果迴圈正常結束(即沒有被 break 打斷的情況下),則執行 else 中的程式碼塊
i = 0
while i < 10:
print(i)
i += 1
else:
print("迴圈執行完畢")
print("其它語句執行了")
在要求滿足很多條件才繼續執行的程式中,可定義一個變數,用於判斷整個程式是否處於活動狀態。這個變數稱為 標誌(flag),充當程式的交通訊號等。可以讓程式在標誌為 True 時繼續執行,並在任何時間導致標誌為 False 時讓程式停止執行。這樣,在 while 語句中就只需檢查一個條件:標誌的當前值是否為 True。然後將所有測試(是否應將標誌設定為 False 的事件)都放在其它地方,從而讓程式更整潔。
i = 0
flag = True
while flag:
print(i)
i += 1
if i == 10:
flag = False
else:
print("迴圈執行完畢")
print("其它語句執行了")
4.4、無限迴圈
while 迴圈的無限迴圈:
while True:
迴圈體
4.5、巢狀迴圈
將一個迴圈結構A宣告在另一個迴圈結構B的迴圈體,就構成了巢狀迴圈;
- 外層迴圈:迴圈結構B,控制行數
- 內層迴圈:迴圈結構A,控制列數
內層結構遍歷一遍,相當於外層迴圈迴圈體執行一次;假設外層迴圈需要執行 m 次,內層迴圈需要執行 n 次。此時內層迴圈的迴圈體一共執行了 m*n 次;
i = 1
while i <= 9:
j = 1
while j <= i:
print(j, "*", i,"=", i*j, end="\t")
j += 1
print()
i += 1
4.6、跳轉語句
- break:結束當前迴圈,後面不能直接寫執行語句,預設跳出包裹此關鍵字最近的一層迴圈;
- continue:結束當次迴圈,後面不能直接寫執行語句,預設結束包裹此關鍵字最近的迴圈的一次;
i = 0
while(i < 5):
i += 1
if(i == 3):
break
print("i = ", i)
else:
print("迴圈結束")
i = 0
while(i < 5):
i += 1
if(i == 3):
continue
print("i = ", i)
else:
print("迴圈結束")
break 和 continue 語句只能配合迴圈語句使用,不能單獨和 if 使用;
break 和 continue 都是隻對離它最近的迴圈起作用;
五、pass空語句
在 Python 中,還有一個 pass 語句,表示空語句,是為了保持程式結構的完整性。它不做任何事情,一般起到佔位的作用。在 Python 3 中,我們可以使用 ... 代替 pass 語句。
# 模組,透過模組可以對Python進行擴充套件
# 引入一個time模組,來統計程式執行時間
from time import *
# time()函式可以用來獲取當前的時間,返回的單位是秒
begin = time()
num = 100000
# 獲取num以內的所有質數
i = 2
while i <= num**0.5:
flag = True
j = 2
while j < i:
if i % j == 0:
# 一旦進入判斷,則證明i一定不是質數
flag = False
# 此時內迴圈沒有繼續執行的必要
# 使用break提前退出迴圈
break
j += 1
if flag:
pass
# print(i)
i += 1
end = time()
print("花費的時間:", end - begin, "秒")