04. 流程控制

星光樱梦發表於2024-09-14

一、流程控制

  流程控制就是用來控制程式執行中各語句執行順序的語句。基本的流程結構為:順序結構分支結構(或稱選擇結構),迴圈結構

  • 順序結構:程式自上到下執行,中間沒有任何判斷和跳轉;
  • 分支結構:根據條件,選擇性的執行某段程式碼,有 if……elseswitch……case 兩種分支語句;
  • 迴圈結構:根據迴圈條件,重複性的執行某段程式碼,有 whiledo……whilefor 三種迴圈語句;

二、順序結構

  順序結構 是 Python 程式預設的執行流程,按照程式碼的先後順序,從上到下依次執行,中間沒有任何的判斷和跳轉

順序結構執行流程

print("你好,世界!")
print("Hello world!")

三、分支結構

  選擇語句 也被稱為 分支語句,它透過給定的條件進行判斷,從而決定執行兩個或者多個分支中哪一隻。因此,在編寫選擇語句之前,應該首先明確判斷條件是什麼,並確定判斷結果為“真”或“假”時應分別執行什麼樣的操作/演算法。在 Python 語言中提供了if 語句用來實現分支結構

3.1、if語句的單分支結構

  Python 中使用 if 關鍵字來組成選擇語句。

if 關係表示式:
    程式碼塊

  執行流程

  1. 首先計算 關係表示式 的值
  2. 如果關係表示式的值為 執行語句體
  3. 如果關係表示式的值為 不執行語句體
  4. 繼續執行後面的其它語句

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. 如果關係表示式的值為 就執行 語句體 1
  3. 如果關係表示式的值為 就執行 語句體 2
  4. 繼續執行後面的其它語句

if語句的雙分支結構

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. 如果為 就執行 語句體 1;如果為 就計算 關係表示式 2 的值
  3. 如果為 就執行 語句體 2;如果為 就計算 關係表示式 3 的值
  4. ……
  5. 如果 所有的關係表示式 結果都為 ,就執行 else 子句中的 語句體 n+1
  6. 繼續執行其它語句

if語句的多分支結構

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迴圈;迴圈結構具有以下四個組成部分:

  1. 初始化部分(init_statement)
  2. 迴圈條件部分(test_exp)
  3. 迴圈體部分(body_statement)
  4. 迭代部分(alter_statement)

  通常情況下,迴圈結構都是因為②中迴圈條件返回false;

4.1、for迴圈

  for 迴圈時一個計次迴圈,通常適用於列舉或遍歷序列,以及迭代物件中的元素。一般應用在迴圈物件已知的情況下。

for 迭代變數 in 可迭代物件:
    語句塊
else:
    程式碼塊

  其中,迭代變數用於儲存讀取出的值;對可迭代物件可以是任何有序的序列物件,如列表、元組、字串等;

  執行流程

  1. 判斷可迭代物件中是否還有項
    • 如果 沒有,則迴圈結束,繼續執行後面的其它語句
    • 如果 ,則 執行迴圈體語句
  2. 下一項
  3. 回到 ① 繼續執行 條件判斷語句
  4. 如果迴圈正常結束(即沒有被 break 打斷的情況下),則執行 else 中的程式碼塊

for迴圈的執行流程

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:
    程式碼塊

  執行流程

  1. 執行 初始化語句
  2. 執行 條件判斷語句,看其結果是 真 還是 假
    • 如果是 迴圈結束,如果迴圈有 else ,則執行 else 裡面的程式碼塊,然後繼續執行後面的其它語句
    • 如果是 執行迴圈體語句
  3. 執行 條件控制語句
  4. 回到②繼續執行 條件判斷語句
  5. 如果迴圈正常結束(即沒有被 break 打斷的情況下),則執行 else 中的程式碼塊

while迴圈的執行流程

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, "秒")