流程控制 if if 是判斷並執行指定敘述,他大概要寫成這個樣子: if condition: expressions... # 若條件成立時 elif another condition: expressions... # 若第一個條件不成立但第二個成立 else: # 條件都不成立 expressions... 裡面的 expression 可以寫任何你想要的敘述,包括變數的宣告、修改,甚至是再寫更多的if。 condition 則要寫入判斷的條件,數值的判斷有 > 、 < 、 >= 、<= ,用 == 來表示相等,!= 來表示不相等。此外可以用 and 來表示兩個條件要同時發生,用 or 來表示其中一個發生就好,而 not 表示條件發生時則不成立,反之亦然。來看以下的範例: a = 100 b = 10 if a > b: print("a > b") else: print("a < b") if a % b == 0 and b < a: print("Logic correct") """ 程式輸出: a > b Logic correct """ for for 是一個迴圈的語法,可以將一段程式以指定的方式重複執行,常用於迭代(iterate)串列或字典等容器,或是生成有規則的數列。 在講 for 之前,我們應該講講迭代器(iterator),迭代器是一個只可以不斷取得下一項的值的型別,我們可以在for的語法中用 in 這個關鍵字來遍歷迭代器內每一個可以迭代的值。如下所示: a = { "hello": "kitty", "world": "didn't say hello back", 100: 10 } for n in a.keys(): print(n) """ 程式輸出: hello world 100 """ 我們可以看到 a.keys() 的結果沒有被變換成 list ,而是直接將他用來迭代, n 會依序變成 a 裡面每一個鍵。 接著如果想要產生一個順序的數列,我們可以使用 range(n) 來產生一個迭代器,讓我們可以從0迭代到n-1,見範例: for n in range(10): print(n) """ 程式輸出: 0 1 2 3 4 5 6 7 8 9 """ 迭代串列也是可以的,如範例: a = [1, 2, 3, 5, 8, 13, 21] for n in a: print(n) """ 程式輸出: 1 2 3 5 8 13 21 """ 如果要迭代串列,但又要同時得到目前是第幾項,可以使用 enumerate 的語法,如範例所示: a = [1, 2, 3, 5, 8, 13, 21] for i, val in enumerate(a): print(i, val) """ 程式輸出: 0 1 1 2 2 3 3 5 4 8 5 13 6 21 """ 就可以分別得到現在是第幾項,還有該項的內容。 while while 也是迴圈的語法,他在條件成立時就繼續執行裡面的程式,反之離開。範例: n = 13 while n != 1: print(n) if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 """ 程式輸出: 13 40 20 10 5 16 8 4 2 """ while 的語法很適合在不知道迴圈確切會跑幾次,只知道結束條件的時候使用。 要注意條件是繼續的條件不是結束的條件! 函數(Function) 函數可以封裝並複用你的程式片段。函數借用了數學上函數的概念,與數學中的函數一樣有參數(argument)與回傳值(return value)。但有少許的不同,比如有可選參數、多重回傳值(透過回傳數組)以及允許函數沒有回傳值。使用 def 關鍵字來宣告函數,如範例所示: def foo(a, b): print("foo:", a, b) return (a + b) * (a – b) x = 1 y = 2 a = foo(1, 2) b = foo(x, y) foo(x, y) """ 程式輸出: foo: 1 2 foo: 1 2 foo: 1 2 """ 可以發現就算忽略函數的回傳值也不會出現錯誤。 我們可以透過回傳數組來達成回傳多個值,見範例: def my_func(a, b): return a + b, a – b x, y = my_func(1, 2) # x = 3, y = -1 ans = my_func(1, 2) # ans = (3, -1) 如果想要設計函數擁有某些可選用的參數,可以預先設定這些參數的預設值,這樣這個參數沒有被傳進來的時候就會被設為預設值,否則就使用傳進來的值。見範例: def foo(a, b=10, c=20): print(f“a: {a}, b: {b}, c:{c}”) foo(1, c=200) # a b c 代 1, 10, 200 foo(1, 2, 3) # a b c 代 1, 2, 3 foo(b=10) # 發生錯誤! 需要填 a 函數之中可以呼叫其他函數,此外呼叫自己也是合法的,我們稱這種情況叫做遞迴,我們看以下的範例: def fac(x): if x <= 1: return 1 return x * fac(x - 1) 範例中實作了一個數學上的階層函數,在某些時候,使用遞迴形式的定義會使函數意外的好寫,但也可能導致麻煩。 錯誤處理 舉個例子,假設這支程式會輸出輸入數字的平方: a = int(input()) print(a ** 2) 然後我輸入了"Apple",那我們應該會得到錯誤並且程式會強制退出,如果我們已經預期到可能有錯,並打算忽略或排解這個錯誤的話,我們可以使用錯誤處理來做到這件事。請見以下範例: reinput = True a = None while reinput: try: reinput = False a = int(input()) except ValueError: reinput = True print(a ** 2) 在範例中,我們捕捉了 ValueError 這個轉型錯誤,在發生這個錯誤時,使使用者重新輸入一個新的值,直到使用者輸入數字,才輸出這個數字的平方。使用try-except的語法可以很好的在預期的錯誤發生時排除或忽略錯誤。 常見的錯誤型別如表: Exception 會比對到所有錯誤 ValueError 例如 int() 中包含無法解析的字串 KeyboardInterrupt 被使用者打斷 KeyError 陣列索引不存在 等 如果想要忽略錯誤,可以使用 pass 來不做任何事。