# FDCSC110 Nov5 Handout - Loop
---
基本上一個比較複雜程式一定要有迴圈才能運作,
也就是說學到這裡算是比較進階的部分了,
因此我希望各位能吸收儘量吸收,
如果不懂的可以等到過幾個月後再回來看。
## While Loop
`while` 迴圈 是 `Python` 裡面最基本的迴圈,
寫起來最簡單,
但比起 `for` 迴圈更容易出現無限迴圈。
### 語法
```python=
while [Boolean]:
...
```
### 應用
1.
```python=
while True:
print(input())
```
一直輸出輸入進來的東西
2.
```python=
i, s = 1, 0
while i <= 10:
s += i
i += 1
print(s) # 55
```
計算 $1$ 到 $10$ 的總和
3.
```python=
ar = ['John', 'Tree', 'Han']
i = 0
while i < len(ar):
print(ar[i])
i += 1
```
輸出 `ar` 裡面的所有元素
### break and continue
`break` 和 `continue` 都是 `Python` 裡的語法,
功能分別是跳脫迴圈和進行下一次的迴圈
```python=
while True:
n = int(input())
if n%2 == 0:
print('{} is even'.format(n))
break
else:
if n == 1:
continue
print('{} is odd'.format(n))
```
在上面的程式碼中,
如果輸入 $2$ 則會輸出 "2 is even",並跳脫迴圈。
如果輸入 $3$ 則會輸出 "3 is odd"。
如果輸入 $1$ 則什麼都不會執行,因為在第 $8$ 行的 `continue`,所以會直接進行下一次的迴圈。
### 練習
[旦旦解題農場-a005: 獨角蟲進化計算器](http://203.64.191.163/ShowProblem?problemid=a005)
:::spoiler `參考解答`
```python=
def main():
w, c, d, ans = 0, 0, 0, 0
c, w = map(int, input().strip().split())
while True:
cnt = c//12
cnt = min(cnt, w)
c -= cnt * 12
d += cnt
w -= cnt
c += cnt
while c < 12 and w > 1 :
c += 1
w -= 1
ans += cnt
c += d
d = 0
if c < 12 or w <= 0:
break
print(ans)
if __name__ == '__main__':
main()
```
:::
## For Loop
`for` 迴圈是所有迴圈裡最不容易出錯的,
因為他的開始和結束都已經規定好了,
除非一開始就放錯,
不然很難出現無限迴圈。
### 語法
```python=
for [Variables] in [Iterable Object]:
...
```
通常放入 `Iterable Object` 的是 `range`、`list`、`tuple`、`map`、`set`
### 甚麼是 Iterable Object ?
`iterable` 的意思是**可迭代的**。
而迭代的意思是以指針的方式代表資料結構裡的每一個元素,
通常用於遍歷整個資料結構。
而 `iterable object` 的意思就是**可迭代的物件**。
### range 結構
`range` 是 `python` 專門用來迭代的物件,
宣告方式如以下
```python=
range([Begin], [End], [Step])
```
上面程式碼的意思是,
宣告一個 `range`,
並且迭代時會從數字**Begin**開始,
直到**End**結束 (不包含**End**),
且每迭代一次,
所迭代的數字會加上**Step**。
`range` 在只放入一項引數時會判定為**End**,
放入兩項時會判定為**Begin**、**End**。
`enumerate` 也是一個好用的迭代物件,
但因為比較複雜,
也沒有一定要學會,
所以這裡先不講。
### 應用
1.
```python=
for i in range(10):
print(input())
```
輸入 $10$ 次,並且每次都輸出輸入的東西
2.
```python=
s = 0
for i in range(1, 11):
s += i
print(s) # 55
```
計算 $1$ 到 $10$ 的總和
3.
```python=
ar = ['John', 'Tree', 'Han']
for i in ar:
print(i)
```
輸出 `ar` 裡面的所有元素
`for` 迴圈也有 `break` 和 `continue`
### 練習
[旦旦解題農場-a028: 文文的求婚--續集 (Case 版)](http://203.64.191.163/ShowProblem?problemid=a028)
:::spoiler `參考解答`
```python=
def main():
T = int(input())
ans = ['a normal year', 'a leap year']
for case in range(T):
y = int(input())
print('Case {}: {}'.format(case+1, ans[y%400==0 or y%4==0 and y%100!=0]))
if __name__ == '__main__':
main()
```
:::
[旦旦解題農場-a191: Rex 看牙1](http://203.64.191.163/ShowProblem?problemid=a191)
:::spoiler `參考解答`
```python=
def main():
try:
while True:
n = int(input())
for i in range(1, n+1):
for i in range(i):
print('%', end='')
print()
except EOFError:
return
if __name__ == '__main__':
main()
```
:::
## Function
程式裡的函數跟數學中的函數有一點不太一樣,
數學中的函數限制較多,
程式中的函數限制較少,
在 `Python` 中更是如此。
### 宣告
```python=
def [Function Name]([Arguments]):
...
```
### 使用方法
1.
```python=
print(input())
```
上面的程式碼是用來輸出輸入的東西。
`print()` 是一個內建的函數,用於輸出。
`input()` 也是內建函數,用於輸入。
他們分別都有各自的引數,
但只有 `input()` 有回傳,
在數學上可理解為**函數值**,
`print()` 則沒有。
2.
```python=
ar = [i for i in range(1, 11)]
print(sum(ar)) # 55
```
在上面的程式碼中,
有 `sum()` 這個內建函數,
可以看到他以 `ar` 為參數帶入 `sum()` 的引數,
並且回傳 `ar` 裡面所有元素的和。