Python - Kiểm tra (Assertions)

Xin chào, các nhà lập trình nhân dịp! Hôm nay, chúng ta sẽ bơi sâu vào thế giới kiểm tra trong Python. Là một giáo viên máy tính hàng xóm thân thiện, tôi rất hứng thú để hướng dẫn bạn qua chủ đề thú vị này. Hãy bắt đầu hành trình này cùng nhau!

Python - Assertions

Kiểm tra trong Python

Hãy tưởng tượng bạn đang xây một cây nhà trên cây. Bạn sẽ không bắt đầu gài ván n钉hau mà không kiểm tra trước tiên rằng nền của bạn có đủ mạnh khỏe không? Đó chính xác là điều gì kiểm tra làm trong lập trình. Chúng giúp chúng ta kiểm tra xem một số điều kiện có đúng trước khi chúng ta tiếp tục với mã của mình.

Trong Python, các kiểm tra là cách để nói, "Tôi tin rằng điều kiện này là đúng, và nếu không, có điều gì đó đã đi sai hết!" Chúng giống như các điểm kiểm tra nhỏ trong mã của bạn đảm bảo rằng mọi thứ đều như cần thiết.

Câu lệnh assert

Cú pháp cơ bản của kiểm tra trong Python rất đơn giản:

assert điều_kiện, thông điệp

Ở đây, điều_kiện là điều gì chúng ta đang kiểm tra, và thông điệp là giải thích tùy chọn xuất hiện nếu kiểm tra thất bại.

Hãy xem một ví dụ đơn giản:

x = 5
assert x == 5, "x nên là 5"
print("Mã tiếp tục...")

Trong trường hợp này, kiểm tra sẽ không có lỗi vì x thực sự là 5, và mã của chúng ta sẽ tiếp tục chạy. Nhưng điều gì xảy ra nếu chúng ta thay đổi giá trị của x?

x = 10
assert x == 5, "x nên là 5"
print("Dòng này sẽ không bao giờ được đạt!")

Ôi! Điều này sẽ gây ra một AssertionError với thông điệp tùy chỉnh của chúng ta, "x nên là 5".

Sử dụng Kiểm tra

Kiểm tra rất hữu ích trong nhiều tình huống khác nhau. Hãy khám phá một số:

1. Kiểm tra đầu vào của hàm

def tính_diện_tích_hình_chữ_nhật(dài, rộng):
assert dài > 0 and rộng > 0, "Độ dài và độ rộng phải là số dương"
return dài * rộng

# Điều này sẽ hoạt động
print(tính_diện_tích_hình_chữ_nhật(5, 3))

# Điều này sẽ gây ra một AssertionError
print(tính_diện_tích_hình_chữ_nhật(-1, 3))

Ở đây, chúng ta đang đảm bảo rằng không ai không thử tính diện tích của một hình chữ nhật với các chiều âm hoặc bằng không. Đó sẽ là một hình chữ nhật rất kỳ lạ, phải không?

2. Xác minh trạng thái nội bộ

class Tài_khoản_ngân_hàng:
def __init__(self, số_dư_bắt đầu):
self.số_dư = số_dư_bắt đầu
assert self.số_dư >= 0, "Số dư bắt đầu không thể là số âm"

def rút_tiền(self, số_tiền):
assert số_tiền > 0, "Số tiền rút phải là số dương"
assert self.số_dư >= số_tiền, "Số dư không đủ"
self.số_dư -= số_tiền

tài_khoản = Tài_khoản_ngân_hàng(100)
tài_khoản.rút_tiền(50)  # Điều này hoạt động
tài_khoản.rút_tiền(60)  # Điều này gây ra một AssertionError

Trong ví dụ này, chúng ta đang sử dụng kiểm tra để đảm bảo rằng tài khoản ngân hàng của chúng ta hành xử chính xác. Chúng ta không thể bắt đầu với số dư âm hoặc rút nhiều tiền hơn mình có. Nếu chỉ ngân hàng thực tế có thể như vậy!

Thông điệp lỗi Tùy chỉnh

Như chúng ta đã thấy, chúng ta có thể thêm thông điệp lỗi tùy chỉnh vào các kiểm tra của mình. Những thông điệp này rất hữu ích khi gỡ lỗi:

def chia(a, b):
assert b != 0, f"Không thể chia {a} cho không"
return a / b

print(chia(10, 2))  # Điều này hoạt động
print(chia(10, 0))  # Điều này gây ra một AssertionError với thông điệp tùy chỉnh của chúng ta

Xử lý AssertionError

Đôi khi, chúng ta có thể muốn chặn và xử lý các AssertionError thay vì để chúng gây ra sự cố chương trình của mình. Chúng ta có thể làm điều này bằng cách sử dụng khối try-except:

def hàm_rủi_ro(x):
assert x > 0, "x phải là số dương"
return 1 / x

try:
kết_quả = hàm_rủi_ro(-5)
except AssertionError as e:
print(f"Một kiểm tra thất bại: {e}")
kết_quả = None

print(f"Kết quả là: {kết_quả}")

Điều này cho phép chương trình của chúng ta tiếp tục chạy ngay cả khi một kiểm tra thất bại, điều này có thể hữu ích trong một số tình huống.

Kiểm tra vs. Ngoại lệ

Bạn có thể đang suy nghĩ, "Tại sao sử dụng kiểm tra khi chúng ta có ngoại lệ?" Đây là một câu hỏi tuyệt vời! Hãy xem xét các sự khác biệt chính:

Kiểm tra Ngoại lệ
Được sử dụng để kiểm tra lỗi của nhà lập trình Được sử dụng để xử lý lỗi chạy thời gian
Nên được sử dụng cho các điều kiện không nên xảy ra Được sử dụng cho các điều kiện lỗi mong đợi
Có thể bị tắt toàn cục Luôn hoạt động
Chủ yếu là công cụ gỡ lỗi Part của chiến lược xử lý lỗi

Kiểm tra giống như các kiểm tra an toàn mà chúng ta làm trước khi bắt đầu chuyến điroller coaster. Ngoại lệ giống như dây an toàn giữ chúng ta nếu có điều gì đó xảy ra trong khi chúng ta đang đi.

Tóm lại, kiểm tra là một công cụ mạnh mẽ trong bộ công cụ của nhà lập trình Python. Chúng giúp chúng ta viết mã có sự độ bền vững và tin cậy hơn bằng cách phát hiện các vấn đề tiềm ẩn sớm. Hãy nhớ, luôn tốt hơn là thất bại nhanh và thất bại to lớn khi có điều gì đó không mong đợi xảy ra trong mã của bạn.

Khi bạn tiếp tục hành trình Python của mình, hãy giữ ý niệm về kiểm tra. Chúng giống như những người bảo vệ trung thành, giám sát mã của bạn và đảm bảo rằng mọi thứ đều như cần thiết. Chúc các bạn lập trình viên tương lai may mắn!

Credits: Image by storyset