Python - 断言

哈囉,有抱负的程式設計師們!今天,我們將深入Python的斷言世界。作為你友善的鄰居電腦老師,我很高興能引導你們通過這個引人入勝的主題。讓我們一起踏上這段旅程!

Python - Assertions

Python中的斷言

想像一下你在建造一個樹屋。在開始釘木板之前,你會先確保你的基礎堅固,對吧?這正是程式設計中斷言所做的。它們幫助我們在繼續撰寫代碼之前檢查某些條件是否為真。

在Python中,斷言是一種說法,"我相信這個條件是真的,如果不是,那麼一定出了什麼嚴重問題!" 它們像是代碼中的小檢查點,確保一切都在應該的位置。

assert語句

Python中斷言的基本語法非常簡單:

assert 條件, 訊息

在這裡,條件是我們要檢查的東西,而訊息是在斷言失敗時出現的可選解釋。

讓我們看一下一個簡單的例子:

x = 5
assert x == 5, "x應該是5"
print("代碼繼續...")

在這個案例中,斷言默默地通過,因為x確實是5,我們的代碼繼續運行。但是如果我們改變x的值呢?

x = 10
assert x == 5, "x應該是5"
print("這一行永遠達不到!")

哎呀!這將引發一個AssertionError,並帶有我們的自定義訊息,"x應該是5"。

使用斷言

斷言在多種情況下都非常有用。讓我們來探索一些:

1. 檢查函數輸入

def calculate_rectangle_area(length, width):
assert length > 0 and width > 0, "長度和寬度必須為正"
return length * width

# 這會工作
print(calculate_rectangle_area(5, 3))

# 這會引發一個AssertionError
print(calculate_rectangle_area(-1, 3))

在這裡,我們正在確保某人不要試圖計算一個具有負數或零維度的矩形的面積。那會是一個非常奇怪的矩形,不是嗎?

2. 驗證內部狀態

class BankAccount:
def __init__(self, initial_balance):
self.balance = initial_balance
assert self.balance >= 0, "初始餘額不能為負"

def withdraw(self, amount):
assert amount > 0, "提款金額必須為正"
assert self.balance >= amount, "餘額不足"
self.balance -= amount

account = BankAccount(100)
account.withdraw(50)  # 這會工作
account.withdraw(60)  # 這會引發一個AssertionError

在這個例子中,我們正在使用斷言來確保我們的銀行帳戶正常運作。我們不能從負餘額開始,也不能提取超出我們的金額。如果真實的銀行也能這麼嚴格就好了!

自定義錯誤訊息

正如我們所見,我們可以向我們的斷言添加自定義錯誤訊息。這些訊息在調試時非常有幫助:

def divide(a, b):
assert b != 0, f"不能除以{a}的零"
return a / b

print(divide(10, 2))  # 這會工作
print(divide(10, 0))  # 這會引發一個AssertionError,並帶有我們的自定義訊息

處理AssertionError

有時,我們可能想要捕獲和處理AssertionError,而不是讓它們摧毀我們的程序。我們可以使用try-except塊來做到這一點:

def risky_function(x):
assert x > 0, "x必須為正"
return 1 / x

try:
result = risky_function(-5)
except AssertionError as e:
print(f"一個斷言失敗:{e}")
result = None

print(f"結果是:{result}")

這允許我們的程序在斷言失敗時仍繼續運行,這在某些情況下可能非常有用。

斷言與異常

你可能會想知道,"既然我們有異常,為什麼還要使用斷言?" 這是一個很好的問題!讓我們來解釋一下關鍵的差異:

斷言 異常
用於檢查程式設計師錯誤 用於處理運行時錯誤
應該用於不應該發生的條件 用於預期的錯誤條件
可以全局禁用 始終啟用
主要用作調試辅助 錯誤處理策略的一部分

斷言就像是我們在過山車啟動前做的安全檢查。異常則像是過山車行進中出現問題時抓住我們的安全帶。

總結來說,斷言是Python程式設計師工具箱中的一個強大工具。它們幫助我們捕獲潛在的問題,並通過早期檢查來撰寫更健壯、更可靠的代碼。請記住,當你的代碼中出現意外的情況時,快速失敗和大聲失敗總是更好的。

當你繼續你的Python旅程時,請記得斷言。它們就像忠實的守護者,監護著你的代碼,確保一切都在應該的位置。快樂編程,未來的Pythonista們!

Credits: Image by storyset