# 迴圈 Ⅱ --- ## 例外處理 ---- 打程式時大家想必遇過程式錯誤 有時也許是因為使用者輸入錯誤 我們可以透過例外處理解決錯誤 ---- ### 格式 ```python try: ''' 可能發生例外的程式 ''' except: ''' 發生例外時要執行的程式 ''' ``` ---- ### 範例 ```python try: a = int(input()) print(a) except: print("發生未知的錯誤。") ``` 藉由 `try:` 與 `except:` ,我們可以解決例外。 ---- ### 例外的類型 舉例: <table class="table table-bordered bg-white text-center border-c" style="color: #333333; border: 1px solid #58595a;" data-darkreader-inline-color="" data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left=""> <tr> <td>英文</td> <td>說明</td> </tr> <tr> <td>TypeError</td> <td>型別錯誤</td> </tr> <tr> <td>IndexError</td> <td>索引超出範圍</td> </tr> <tr> <td>ZeroDivisionError</td> <td>除以零</td> </tr> <tr> <td>EOFError ⭐</td> <td> input() 沒有輸入資料時發生</td> </tr> </table> <br> ---- 我們可以對特定的 `Error` 進行不同的處理 在 `except` 後加上要偵測的例外 ```python try: x = int(input()) y = int(input()) result = x / y except ZeroDivisionError: print("不可以除於零!") except ValueError: print("不可輸入此型態!") except EOFError: print("輸入不可為空!") except Exception as e: print("發生未知的錯誤!\n錯誤訊息:", e) ``` 也可藉由 `Exception as e` 輸出錯誤訊息 --- ## `EOFError` ---- `EOFError` 是常見的例外,發生時機為輸入為空 在 `Window` 執行時先按 `Ctrl` + `Z` 再按 `Enter` 就會發生 ---- 雖然是例外,但我們可以運用`EOFError`做許多事 例如: ```python line = [] while True: try: n = input() line.append(n) except EOFError: print("讀到 EOF,結束迴圈") break print("收到:", line) ``` 在 `EOFError` 發生前不斷輸入資料 在 `EOFError` 發生後停止輸入資料 最後輸出結果 --- ## 迴圈與串列 ---- 因為串列是序列的一種 可以藉由迴圈輸出串列的每一項 ```python scores = [85, 90, 78, 92, 88] for s in scores: print(s) ``` 忘記序列是什麼的人可以看這裡: [什麼是序列(sequence)?](https://hackmd.io/@CRC-YUSHAN/B1c4-HH2gx#/2/2) ---- 串列可以藉由 `len()` 得知其長度 ```python= scores = [85, 90, 78, 92, 88] for i in range(len(scores)): #長度多長就執行幾次 print(f"第{i+1}位學生分數:{scores[i]}") ``` --- ## `stack` ---- ### `stack` 是什麼? <img src="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rk87XtBJ0AAn1SzAhOU8sA.png" > A:後進先出的資料結構 ---- 我們可以藉由 `append()` 與 `pop()` 改變 `stack` ---- 範例: 1️⃣ 建立與操作 Stack ```python stack = [] # 建立空堆疊 stack.append(10) # push stack.append(20) stack.append(30) print(stack) # [10, 20, 30] ``` 2️⃣ 取出最上層元素 (pop) ```py top = stack.pop() # 取出最上層 print("取出的元素:", top) print("目前堆疊:", stack) ``` ---- 輸出: ```bash 取出的元素: 30 目前堆疊: [10, 20] ``` ---- 3️⃣ 查看堆疊頂端(前提是 `stack` 不是空的) ```python if len(stack) > 0: print("堆疊頂端元素:", stack[-1]) ``` 4️⃣ 判斷是否為空 ```python if not stack: print("堆疊是空的") else: print("堆疊有資料") ``` ---- ### 範例-反轉字串 ```python= text = "python" stack = [] # 把字元逐一放進堆疊 for ch in text: stack.append(ch) # 從堆疊取出,形成反轉字串 reversed_text = "" while stack: reversed_text += stack.pop() print("反轉結果:", reversed_text) ``` [別忘了另一種方法](https://hackmd.io/@CRC-YUSHAN/ryb1DhYRlg#/6/7) ---- ### 實作:車站問題 ### [`c123.`](https://zerojudge.tw/ShowProblem?problemid=c123) ---- 解答: ```python= while True: n = int(input()) if n == 0: break while True: a = list(map(int, input().split())) if a[0] == 0: break cur = 0 stack = [] for i in range(1, n + 1): stack.append(i) while stack and stack[-1] == a[cur]: stack.pop() cur += 1 if not stack: print("Yes") else: print("No") print() ``` ---- ### [解說](https://hsnucrc47.github.io/python-class/articles/rails) --- ### 後綴零 來源:[CSES - Trailing Zeros](https://cses.fi/problemset/task/1618) #### 計算階乘( `n!` )後綴零的數量。 例如: ```bash 10! = 3628800 ``` `10!` 有 `2` 個後綴零 ---- ### 分析 1. 每個後綴零都來自一對 `2` 和 `5` 相乘 ↓ 2. 因數 `2` 的數量必定大於因數 `5` 的數量 ↓ 3. 因數 `5` 的數量就是後綴零的數量! ↓ 4. 先數 $5^{1}$ 的倍數數量,再數 $5^{2}$ 的倍數數量,再數 $5^{3}$ 的倍數數量,依此類推\ ---- 為什麼第四步要增加次方呢? A:因為某些數可以產生不只一個後綴零 例如: `25` 可以產生兩個後綴零 可以藉由增加次方重複數到 ---- ### 解答 ```python # n 為輸入; i 預設為 5 ; cnt 為統計後綴零 n, i, cnt = int(input()), 5, 0 while i <= n: cnt += n // i #統計在 n 裡有幾個 i 的倍數,即幾個後綴零 i *= 5 # 增加 5 的次方 print(cnt) ```
{"description":"多變數輸入、串列、切片","slideOptions":"{\"theme\":\"sky\",\"transition\":\"convex\"}","title":"迴圈 Ⅱ","contributors":"[{\"id\":\"b831f9fa-52bb-4a09-bfbb-148e4fdadd0f\",\"add\":4808,\"del\":498,\"latestUpdatedAt\":1762435987448}]"}
    156 views