# FDCSC110 Nov5 Slideshow - 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` 裡面所有元素的和。
{"metaMigratedAt":"2023-06-16T13:52:55.592Z","metaMigratedFrom":"Content","title":"FDCSC110 Nov5 Slideshow - Loop","breaks":true,"contributors":"[{\"id\":\"f6e5d959-6236-46bd-9933-dbc93eaee9e0\",\"add\":3942,\"del\":0}]"}
    256 views