9.3 流程控制與迴圈

關於程式中流程控制

  流程控制是指在程式執行時,個別的指令執行或求值的順序。程式執行基本上是由上而下的一行一行執行,但會依照「流程控制指令」的指示,去判斷不同情況執行不同的程式區塊或設定條件執行某些重複的內容。   流程控制結構和演算法的三種基本結構(可以看看第7.2章介紹!)大致相同,為循序結構(Sequence structure)、選擇結構(Selection structure)及迴圈結構(Loop structure)。在大多數的程式語言中,可以將流程控制再細分為「條件判斷控制」與「迴圈控制」,這章將以python語言為例做介紹。

條件判斷控制

  條件判斷控制中,會依據條件(運算式的結果)改變程式執行的順序。當滿足條件時,會執行某一程式區塊,而條件不滿足時,則執行另一個程式區塊。選擇結構大多可以分為三種:單一選擇雙向選擇多向選擇,而你也可以選擇巢狀if來完成指令。

單向選擇 if

單向選擇if(如果···就···):當判斷式成立時即執行該程式區塊

if 條件式 :
    執行的程式內容
    
# 執行的程式內容前有「四個空格」,這叫作「縮排」
  這是python要去判斷程式碼屬於哪個層級下的方法,
  只要在同一層縮排就是屬於上方「:」下的內容。
  有別於其它以大括號{}括起的程式語言。
height = eval(input("請輸入你的身高"))
if height >= 180:
    print("你好高!")

-
執行結果:
請輸入你的身高180
你好高!

雙向選擇 if···else

雙向選擇 if···else(如果···就···否則就···):當條件成立時可以執行if下的程式區塊,而當不成立時就執行else下的程式區塊。

if 條件式 :
    條件成立時執行的程式內容
else :
    條件不成立時執行的程式內容
height = eval(input("請輸入你的身高"))
if height >= 180:
    print("你好高!")
else :
    print("喝牛奶可以長高高!")

-
執行結果1:
請輸入你的身高180
你好高!
-
執行結果2:
請輸入你的身高150
喝牛奶可以長高高!

多向選擇 if···elif···else

多向選擇 if···elif···else(如果···就···否則就···):當第一個條件成立時可以執行if下的程式區塊,不然就看第二個條件是否成立,成立時就執行該elif下的程式區塊,以此類推。當所有條件都不成立時就執行else下的程式區塊。elif沒有個數的限制,可以依照自己的需求而定。

if 條件式1 :
    條件1成立時執行的程式內容1
elif 條件式2 :
    條件2成立時執行的程式內容2
elif 條件式3 :
    條件3成立時執行的程式內容3
else :
    條件都不成立時執行的程式內容4
bmi = eval(input("請輸入你的BMI"))
if bmi <18.5 :
    print("哇你體重不足,多吃一點")
elif bmi <24.5 :
    print("體重正常喔~好棒!")
elif bmi <29.9 :
    print("體重過重了,要多運動囉")
else :
    print("算肥胖了,注意身體健康!")

-
執行結果1:
請輸入你的BMI17
哇你體重不足,多吃一點
-
執行結果2:
請輸入你的BMI23
體重正常喔~好棒!
-
執行結果3:
請輸入你的BMI26
體重過重了,要多運動囉
-
執行結果4:
請輸入你的BMI34
算肥胖了,注意身體健康!

巢狀if

巢狀if的意思是在一組if-else中,還有另一組if-else。當要在判斷條件中安排更進一步的判斷條件時,便需要用到啦!

迴圈控制

  處理資料時,常會需要重複執行相同的步驟,這時就需要迴圈來幫助我們,它會讓某段程式區塊的敘述在條件符合的情況下重複執行,一直到不符合條件或達到設定次數才跳出迴圈。

for迴圈

  • 以「for」和「in」這兩個字組成,在兩字之間會放入我們自訂的變數,而in後面可接序列(sequence,list、str、tuple皆是序列的一種),迴圈會依序從序列中取得元素,並將元素指派給前面的變數,再執行迴圈內容。

sequences = [1, 'apple', 2, 'banana']
for k in sequences:
    print(k)

# 小提示:[]為list將數字或文字等元素包起來
# for迴圈的執行內容一樣要有縮排喔!

-
執行結果:
1
apple
2
banana
  • for迴圈也能以range()函式協助我們創建一個整數序列,用法為(起始值,終止值,遞增(減)值)

    • range(11):產生從0到10的整數序列。

    • range(1,11):產生從1到10的整數序列。(未指定遞增值的情況下,遞增值為1)

    • range(0, 10, 2):產生從0, 2, 4, 6, 8的整數序列(遞增值為2)。

for i in range(1, 11):
    print(i)
    
-
執行結果:
1
2
3
4
5
6
7
8
9
10
  • 巢狀for迴圈:巢狀迴圈也就是迴圈裡又包著迴圈,外層迴圈每動作一次,內層迴圈就會把自身的整個迴圈執行一遍,執行完畢後才跳回外層迴圈。

for f in range (1,10):
    for s in range (2,10):
        t = f*s
        print("%d*%d=%2d"% (s,f,t),end='') # 每個數乘到9時換行
    print()
    
-
執行結果:
2*1= 2  3*1= 3  4*1= 4  5*1= 5  6*1= 6  7*1= 7  8*1= 8  9*1= 9  
2*2= 4  3*2= 6  4*2= 8  5*2=10  6*2=12  7*2=14  8*2=16  9*2=18  
2*3= 6  3*3= 9  4*3=12  5*3=15  6*3=18  7*3=21  8*3=24  9*3=27  
2*4= 8  3*4=12  4*4=16  5*4=20  6*4=24  7*4=28  8*4=32  9*4=36  
2*5=10  3*5=15  4*5=20  5*5=25  6*5=30  7*5=35  8*5=40  9*5=45  
2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  7*6=42  8*6=48  9*6=54  
2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  8*7=56  9*7=63  
2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  9*8=72  
2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

while迴圈

  • while迴圈與for迴圈相似,for迴圈能做到的,while迴圈幾乎也能做到。

while 判斷式:
    執行式
a=1
while a < 5 :
    a += 1
    print(a)

-
執行結果:
2
3
4
5
  • 但for迴圈比較適合用在「已知迴圈數」的問題上,而while則適用在「未知迴圈數」的問題上。

break與continue

  • 迴圈分為規則結束不規則結束

    • 規則結束是判斷條件不再符合時,迴圈自然結束

    • 不規則結束是,迴圈自然結束前,我們已經得到想要的結果,利用強制中斷的方式結束迴圈

    • python提供兩個指令來供我們中斷迴圈流程或跳過迴圈中的某些敘述。

  • break:中斷迴圈的執行並跳脫迴圈結構,循環不再執行

  • continue:不會讓迴圈結束,只跳過迴圈內 continue 後面的剩餘敘述,再回到迴圈的判斷式,繼續執行下一次的迴圈運作。

# break:終止當前循環,循環不再執行

a = 1
while a < 10 :
    a += 1
    if a == 5 :
        break
    print(a)
    
-
執行結果:
2
3
4
# continue:跳過本次循環,循環繼續

a = 1
while a < 10 :
 a += 1
 if a == 5 :
 continue
 print(a)
 
-
執行結果:
2
3
4
6
7
8
9
10

小結

  雖然程式語言的語法寫出來都不盡相同,但大多數的程式語言都具備「條件判斷」及「迴圈」這兩個流程控制指令,只要你搞清楚觀念,不論是學python或是其它,相信都能以這基本概念上手!

Last updated