Python [5] 雜項

例外處理/基礎模組/檔案管理

INFOR38th 學術 葉倚誠

講師:葉倚誠

  • 年次:116

  • 社團:建中資訊

  • 幹位:學術

  • 放課:演算法(STL、基礎圖論)

  • 火鍋加芋頭、咖哩飯要拌

  • 大括號不下放

My IG

INFOR38th IG

課程目錄

  • 例外處理
  • 基礎模組
  • 檔案管理
  • Kahoot!

例外處理

為什麼需要例外處理?

n = input("Please enter your score: ")
n = int(n)  # 字串轉換為整數

if n >= 60:
    print("Pass")
else:
    print("Fail")

如果我今天輸入的不是整數?

Value Error

例外處理

  • 直譯器執行程式發生錯誤則導致例外
  • 發生例外後會使程式停止執行

例外處理?

  1. 在程式執行時捕捉可能發生的例外
  2. 例外發生時避免停止程式執行

避免因為無法預測的原因導致程式無法完成執行!

常見例外 (Exception)

ValueError 數值錯誤 (參數無效)
TypeError 資料型別錯誤
NameError 變數名稱無效
IndexError 索引值範圍無效
ImportError 模組匯入錯誤
ZeroDivisionError 除數為0錯誤
KeyboardInterrupt 使用者中斷程式

捕捉例外

我們可以使用 try-except-else-finally 語法!

try:
    可能發生例外的程式片段
except 例外:
    處理指定例外的程式片段
except Exception (as e):
    處理其他例外 (不含系統例外) 的程式片段
except:
    處理其他例外的程式片段:
else:
    若未發生例外時執行的程式片段
finally:
    程式結束執行的程式片段

捕捉例外範例

n = input("Please enter your score: ")

try:  # 嘗試執行程式片段
    n = int(n)
except ValueError:  # 捕捉可能發生的例外
    print("Please enter a valid integer score.")
else:  # 若未發生例外則執行
    if n >= 60:
        print("Pass")
    else:
        print("Fail")
finally:  # 程式結束執行
    print("End of program.")

例外處理

練習:請撰寫一個程式,使用者輸入兩個整數後輸出前者除以後者的結果

捕捉以下例外!並輸出不同結果表示程式錯誤

1. 除數為0

2. 輸入非整數

3. 其他例外

斷言 (Assert)

  • 自訂程式執行規則,並在違反規則時產生例外
  • 可在特殊程式中使用,例如物理現象模擬中,斷言 t >= 0
assert 布林值, 例外

斷言 (Assert)

定義阿嬤走路的時速 (v) <= 10 (km/hr),否則拋出例外

v = int(input("請輸入阿嬤走路的時速:"))
assert v <= 10, "阿嬤走路的時速不可能超過 10 (公里/小時)"
print(f"阿嬤走路的時速:{v} 公里/小時")

斷言 (Assert)

練習:請撰寫一個程式,使用者輸入速度、時間,輸出位移

  • 使用 assert,確保 t >= 0
  • 使用例外處理,確保輸入的皆為數字
  • 違反 assert 規則時不終止程式

斷言 (Assert)

參考答案

try:
    v = int(input())
    t = int(input())
    assert t >= 0, "時間必為非負數"
    s = v * t
    print(s)
except Exception as e:
    print(f"Error: {e}")

基礎模組

什麼是模組 (Module)?

  • 內建或第三方的程式碼組合,可以直接匯入使用
  • 可以用模組更簡單地完成複雜的程式
  • 如同工具箱,有各種功能可以使用
import 模組
import 模組 as 名稱
from 模組 import 類別
from 模組 import*

常用基礎模組

Random 亂數
Math 數學函式
Os 系統管理
Re 字串處理(正規表達式)
Time 時間操作
Json Json 資料處理

Random

import random

n = random.randint(1, 10) # 指定範圍中隨機選取一個數字
print(n)
n = random.randrange(2, 10, 2) # 指定 range 數組中隨機選取一個數字
print(n)
nums = [1, 2, 3, 4, 5]
print(random.choice(nums)) # 指定串列中隨機選取一個元素
print(random.sample(nums, k=3)) # 指定串列中隨機選取 k 個不重複元素
random.shuffle(nums) # 隨機排序串列元素
for i in nums:
  print(i, end=" ")

Math

import math

print(math.sqrt(16)) # 開根號
print(math.factorial(5)) # 階乘
print(math.gcd(48, 18)) # 最大公因數
print(math.lcm(4, 5)) # 最小公倍數
print(math.isqrt(20)) # 整數開根號
print(math.comb(5, 2)) # 組合
print(math.perm(5, 2)) # 排列
print(math.log2(8)) # 對數
print(math.log10(100)) # 常用對數

模組 (Module)

練習:請撰寫一個程式,使用者輸入整數 n,並輸入 n 個字串,從輸入的字串中隨機選取一個輸出 (提示:使用 random + list)

捕捉 n 不為整數的例外!

模組 (Module)

參考答案

import random

try:
    n = int(input())
    elements = []
    for i in range(n):
        elements.append(input())
    print(random.choice(elements))
except ValueError:
    print("ValueError")

封包 (Package)

  • 一個資料夾中有多個模組
  • 必需包含 __init__.py 檔案
package/
    __init__.py
    module1.py
    module2.py
    package1/
        __init__.py
        module3.py
from package.package1 import module3
import package.package1.module3 as m3

檔案管理

什麼是檔案管理?

  • 使用程式讀取或寫入外部檔案
  • 可以配合系統管理或檔案路徑操作模組
file_object = open(filename, mode, encoding)

開啟檔案

常用模式 (mode 參數):'r'、'w'、'a'

分別為:讀取、寫入、附加

讀取檔案

file = open("data.txt", "r", encoding="utf-8")  # 開啟檔案
content = file.read()  # 讀取檔案
print(content)
file.close()  # 關閉檔案

with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()  # 讀取檔案內容
    print(content)
read() 讀取檔案
readline() 逐行讀取檔案
readlines() 逐行讀取檔案並儲存至串列

寫入檔案

# 寫入模式
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("1\n")
    f.write("2\n")

# 附加模式
with open("output.txt", "a", encoding="utf-8") as f:
    f.write("Hello\n")
write() 讀取檔案
writelines(list) 逐行寫入,參數傳入串列
print(文字, file) 使用 print() 寫入檔案

Kahoot

The End

Python [5]

By Ethan Yeh