Câu lệnh điều kiện quyết định chương trình chạy theo nhánh nào. Python có cú pháp khá gọn, và từ phiên bản 3.10 còn có thêm match cho những trường hợp phức tạp.
if, elif, else
diem = 8.5
if diem >= 9:
xep_loai = "Xuất sắc"
elif diem >= 8:
xep_loai = "Giỏi"
elif diem >= 6.5:
xep_loai = "Khá"
else:
xep_loai = "Trung bình"
print(xep_loai)
Python dùng thụt lề thay cho dấu ngoặc nhọn. Thụt lề sai là lỗi cú pháp, không phải chuyện thẩm mỹ — hãy dùng bốn dấu cách và để trình soạn thảo tự căn.
Điều kiện gọn gàng
Python cho phép so sánh chuỗi liên tiếp một cách tự nhiên:
if 18 <= tuoi < 60:
print("Trong độ tuổi lao động")
Và kiểm tra nhiều giá trị bằng in thay vì viết một chuỗi or dài:
# Dài dòng
if ngay == "T7" or ngay == "CN":
...
# Gọn hơn
if ngay in ("T7", "CN"):
...
Giá trị nào được coi là “sai”?
Python coi những thứ sau là sai trong ngữ cảnh điều kiện: False, None, số 0, chuỗi rỗng, danh sách/dict/set rỗng. Mọi thứ khác là đúng.
ds = []
if not ds:
print("Danh sách rỗng")
# Thay vì viết
if len(ds) == 0:
...
Cẩn thận với số 0
Đây là cái bẫy thật sự:
so_luong = 0
if so_luong:
print("Có hàng") # KHÔNG chạy, dù so_luong có giá trị hợp lệ
Khi 0 là một giá trị hợp lệ, hãy so sánh rõ ràng với None:
if so_luong is not None:
print(f"Số lượng: {so_luong}")
Toán tử ba ngôi
trang_thai = "Đạt" if diem >= 5 else "Không đạt"
Dùng cho biểu thức ngắn. Nếu phải lồng nhiều tầng thì viết if thường sẽ dễ đọc hơn nhiều:
# Khó đọc
x = "a" if p else "b" if q else "c" if r else "d"
match — so khớp mẫu
Từ Python 3.10, match giải quyết những trường hợp mà chuỗi elif trở nên rườm rà:
def xu_ly_lenh(lenh):
match lenh.split():
case ["thoat"]:
return "Đang thoát..."
case ["mo", ten_file]:
return f"Đang mở {ten_file}"
case ["xoa", *danh_sach]:
return f"Xóa {len(danh_sach)} tệp"
case _:
return "Lệnh không hợp lệ"
print(xu_ly_lenh("mo bao_cao.txt")) # Đang mở bao_cao.txt
print(xu_ly_lenh("xoa a.txt b.txt")) # Xóa 2 tệp
Điểm mạnh của match không nằm ở việc so sánh giá trị — chỗ đó if làm tốt rồi — mà ở khả năng tách cấu trúc dữ liệu và gán biến ngay trong lúc so khớp.
So khớp với dict
def xu_ly_su_kien(su_kien):
match su_kien:
case {"loai": "click", "x": x, "y": y}:
return f"Nhấp tại ({x}, {y})"
case {"loai": "phim", "ma": ma}:
return f"Nhấn phím {ma}"
case {"loai": loai}:
return f"Sự kiện lạ: {loai}"
case _:
return "Dữ liệu không hợp lệ"
Thêm điều kiện phụ
match don_hang:
case {"tong": tong} if tong > 1_000_000:
print("Đơn hàng lớn, cần duyệt")
case {"tong": tong}:
print(f"Đơn hàng {tong}đ")
Một lưu ý về case _
Dấu gạch dưới là nhánh mặc định, khớp mọi thứ. Nhưng cẩn thận: tên biến trong case sẽ gán chứ không so sánh:
MAU_MAC_DINH = "đỏ"
match mau:
case MAU_MAC_DINH: # SAI - đây là gán, khớp mọi giá trị
...
Muốn so sánh với hằng số, phải dùng dạng có dấu chấm:
class Mau:
MAC_DINH = "đỏ"
match mau:
case Mau.MAC_DINH: # ĐÚNG - so sánh giá trị
...
Nên dùng cái nào?
Dùng if/elif cho phần lớn trường hợp — nó quen thuộc và ai đọc cũng hiểu. Chuyển sang match khi bạn cần tách cấu trúc dữ liệu phức tạp, hoặc khi chuỗi elif đã dài tới mức khó theo dõi.