iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

學習原因:

程式流程控制 是寫程式的一個關鍵概念,它 控制執行流程和順序。通過使用各種 控制結構條件語句,决定哪些程式碼會被執行,以及它們被執行的次數。主要目的是使程序能夠根據不同條件執行不同的操作,以滿足特定的需求和邏輯。

學習目標:

  • 選擇結構 Decision Structure 的應用
  • 迴圈結構 Looping Structure 的應用
  • Break 和 Continuous 的運用
  • 了解什麼是 Exception Handling

選擇結構 Decision Structure

  • If…elif…else (若…或若是…否則…) :

    • 從字面就很好理解了,根據不同的 條件 決定執行哪一段程式碼。
    • 條件 (Condition): 應用 比較 Operator邏輯 Operator 來寫成
    def get_grade(score):
    	if score >= 90:
    		grade = "A"
    	elif score >= 80:
    		grade = "B"
    	elif score >= 70:
    		grade = "C"
    	elif score >= 60:
    		grade = "D"
    	else:
    		grade = "F"
    
    	return grade
    
    print(get_grade(95)) # 會進入 score >= 90 的範圍執行
    print(get_grade(70)) # 會進入 score >= 70 的範圍執行
    print(get_grade(50)) # 會進入 else 的範圍執行
    

    Output:

    A
    C
    F
    
  • Match…case… (…符合…情況時)

    • 在 Python 3.10 或更新的版本後才出現的語法
    • 用法跟 If…elif…else 類似,根據 參數的值 來決定執行哪一段程式碼。
    def switch_case(value):
    	match value:
            case 1:
                print("Case 1")
            case 2:
                print("Case 2")
            case _:
                # 在未匹配到任何 case 時執行的程式碼
                print("Default Case")
    
    # 測試
    switch_case(2)
    switch_case(4)
    

    Output:

    Case 2
    Default Case
    

迴圈結構 Looping Structure

Python 主要有 2 種 迴圈: For Loop 和 While Loop

  • For loop (每…執行…)

    • 基本寫法:

      for variable in iterator:
      	statement1
      
      • variable: 循環變數,資料為迭代對象中的當前元素。
      • iterator: 可迭代的對象
        1. 範圍: Python 內建 function range() 可取得迭代的範圍

          有三種寫法:

          • range(stop):會從 0 開始迭代至 stop 前的值

            I.e. range(5) 則為 0, 1, 2, 3, 4

          • range(start, stop) : 會從 start 的值開始迭代至 stop 前的值

            I.e. range(2, 5) 則為 2, 3, 4

          • range(start, stop, step) : 會從 start 的值開始迭代至 stop 前的值,每次遞增/減 step 的值

            I.e. range(0, 10, 2) 則為 0, 2, 4, 6, 8
            I.e. range(10, 0, -2) 則為 10, 8, 6, 4, 2

          def num_sum(end_num):
          
          	total = 0
          
          	for num in range(1, end_num):
          		# 每次 total 都會與 num 的值相加
                  total += num
          
          	return total
          
          def odd_sum(end_num):
          
          	odd_total = 0
          
          	for odd_num in range(1, end_num, 2):
          		 odd_total += odd_num
          
          	return odd_total
          
          print(f"總和: {num_sum(10)}") # 結果應為 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
          print(f"奇數總和: {odd_sum(10)}") # 結果應為 1 + 3 + 5 + 7 + 9 = 25
          

          Output:

          總和: 45
          奇數總和: 25
          
        2. string : 字串的每個字符是可以被迭代的

          str = "Hello"
          
          for char in str:
          	print(char)
          

          Output:

          H
          e
          l
          l
          o
          
        3. listdict 的 keys (這部分會在下一篇文章說明)

  • While Loop (當...執行…)

    • 基本寫法為 while <condition>
    • condition: 應用 比較 Operator邏輯 Operator 寫成執行 while loop 的條件,在符合條件的情況下會執行一次內容,直到條件不符為止。
    counter = 1
    
    # 當 counter 為 1 或 2 時,會執行迴圈來容
    while counter == 1 or counter == 2:
        print(counter)
    	# counter 的值會在每次執行時 +1
        counter += 1
    

    Output:

    1
    2
    

For Loop 和 While Loop 都是讓一些程式碼重覆執行,在不同的情況下,需要選用不同的 Looping 方法。

  • For loop 一般應用在已知迴圈次數的情況。
  • 而 While Loop 是在不知道迴圈的次數,但可以條件判斷什麼時候結束。

像是以下例子:

  • 小明的薪水為 50000,每年增加 4%,計算 10 年後他的薪水是多少?

    (已知需要執行 10 次,所以會選用 For Loop)

  • 小時的薪水為 50000,每年增加 4%,計算多少年後,他的薪水會變 2 倍?

    (不知道需要執行多少次,但知道結束的條件為薪水達到 2 倍的時候,選用 While)

剛好可以作為練習,試著寫寫看。

應用 While Loop 的時候更需要注意會否出現 無窮迴圈 的情況
While Loop 所設定的條件永遠都符合時,迴圈則會不斷執行,永無終結,這樣會讓程式無法執行結束。這時只>能用 Ctrl + C 來停止執行。
因此下條件的時候必須要小心。

Break & Continues (中斷和繼續)

在 Looping 的課題,額外需要學習的還有 BreakContinues

  • Break: 強制離開迴圈,在迴圈結束前,可以因應某些情況判斷是否要中斷迴圈。

    for i in range(1, 6):
    	# 本應會執行 5 次,i 分別為 1, 2, 3, 4, 5
        if i == 3:
    		# 但如 i 為 3 時,會直接中斷迴圈
            break
        print(i)
    

    Output:

    1
    2
    
  • Continues: 在某些情況下,迴圈內不需要執行任何動作,會使用 Continues 以結束這次的迴圈,跳到下一個。

    for i in range(1, 6):
        if i == 3:  # 如 i = 3 的時候,會執行以下程式
            continue  # 會結束當下這次的執行,迭代到下一個 i(即為 4),continue 後面的程式碼不會執行
        print(i)
    

    Output:

    1
    2
    4
    5
    6
    

在其他語言像是 JAVA 會有 Do…While…迴圈,這其實跟 While Loop 相似,只是 Do While 會強制至少先執行一次迴圈內容,條件符合才重覆執行下一次。而 Python 的世界裡沒有 Do … While…,但應用 While Loop 亦可以做到類似效果。

count = 0
# While True 使必然要執行一次
While True:
	# 在這裡執行循環內的程式碼
	count += 1

	# 檢查條件,決定是否繼續執行迴圈
	if count > 10
		break

例外處理 Except (Try … Except …) [官方文件]

執行程式的過程,發生一些非預期的結果,系統會跳出例外 (Throw Exception),會直接終止,不再執行後面的程式碼。如果不想程序終止,使用 Try Except 可以抓住例外,作處理後會繼續執行後續的程式碼。

Exception 有很多種,可以針對不同類型的 Exception 作不一樣的處理。

Exception Handling 的應用:

  • 對於非預期反應作出處理,避免程式終斷
  • 出現錯誤時,套用 Log 進行記錄,儘管程式沒有中斷也能發現哪裡曾經出現狀況。
try:
   # Try Statement 有可能出現錯誤的程式碼

except [exceptionType [as variable]]:
   # Except Statement 拋出例外時需要執行的程式碼

[else:
   # Else Statement 沒有出現錯誤才會執行的程式碼 (Optional) ] 

[finally:
   # Finally Statement 不管有沒有出錯都會執行的程式碼 (Optional) ]

例子:

def ten_divided_by(num):
try:
    # 試圖執行可能引發異常的程式碼
    result = 10 / num  # 這個有機會引發 除以 0 的異常

except ZeroDivisionError:
    # 處理特定類型的異常
    print("ZeroDivisionError occured.")

else:
    # 當沒有異常時執行
    print(f"No Exception. The result is {result}")

finally:
    # 無論是否發生異常都要執行
    print("--- Finally Finished ---")

ten_divided_by(0)
ten_divided_by(10)

Output:

ZeroDivisionError occured.
--- Finally Finished ---
No Exception. The result is 1.0
--- Finally Finished ---

除了系統遇到錯誤會自動引發例外,也可以自行強制引發指定的例,可使用 raise <Error>

divider = 0
if divider == 0:
	raise ZeroDivisionError

Output:

Traceback (most recent call last):
  File "<file_path>", line 3, in <file_name>
    raise ZeroDivisionError
ZeroDivisionError

程式流程控制使程序能夠根據不同的條件和數據来執行不同的操作,允許你編寫靈活和功能強大的程序,從而實現更複雜的邏輯和功能。

介紹一個網站有蠻多基礎應用的例子,可以參考看看: https://www.programiz.com/python-programming/examples


上一篇
Day 02: 認識程式語言的基礎
下一篇
Day 04: Python 的 list, tuple, set 和 dict
系列文
從 0 開始培育成為自動化測試工程師的學習指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
SK.
iT邦新手 5 級 ‧ 2024-06-07 09:54:27

Match…case… 例子中的縮排沒做好喔/images/emoticon/emoticon08.gif

def switch_case(value):
    match value:
        case 1:
            print("Case 1")
        case 2:
            print("Case 2")
        case _:
            # 在未匹配到任何 case 時執行的程式碼
        	print("Default Case")

# 測試
switch_case(2)
switch_case(4)
yingngai iT邦新手 4 級 ‧ 2024-06-07 10:57:45 檢舉

謝謝提醒,跑掉了,已修改/images/emoticon/emoticon41.gif

我要留言

立即登入留言