# 迴圈 Ⅱ
---
## 例外處理
----
打程式時大家想必遇過程式錯誤
有時也許是因為使用者輸入錯誤
我們可以透過例外處理解決錯誤
----
### 格式
```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}]"}