Câu lệnh if cho chương trình chọn đường: điều kiện đúng thì làm việc này, sai thì làm việc khác. Quái hết máu thì cho biến mất, đủ vàng thì cho mua đồ, bấm phím nào thì làm hành động đó.
if
hp = 0
if hp <= 0:
print("Game over") # Game over
Cú pháp gồm từ if, điều kiện, dấu :, rồi khối lệnh thụt vào 4 dấu cách. Điều kiện là bất kỳ thứ gì ra True hay False, xem Bool và toán tử.
Lỗi hay gặp: quên dấu
:cuối dòngif. Python báoSyntaxError: expected ':'. Còn quên thụt lề thì báoIndentationError, xem lại Cú pháp Python.
else
else chạy khi điều kiện của if sai:
gold = 120
sword_price = 250
if gold >= sword_price:
gold -= sword_price
print("Đã mua kiếm")
else:
print(f"Thiếu {sword_price - gold} vàng") # Thiếu 130 vàng
elif
Có nhiều trường hợp thì dùng elif (viết tắt của "else if"). Python kiểm tra từ trên xuống, gặp điều kiện đúng đầu tiên thì chạy khối đó và bỏ qua tất cả phần còn lại.
hp = 45
if hp > 70:
print("Khỏe")
elif hp > 30:
print("Bị thương") # Bị thương
elif hp > 0:
print("Nguy kịch")
else:
print("Đã gục")
hp = 45 cũng lớn hơn 0, nhưng dòng "Nguy kịch" không in vì hp > 30 đã đúng trước.
Chỗ người mới hay sai là đặt điều kiện rộng lên trước:
score = 950
if score >= 500:
rank = "B"
elif score >= 900:
rank = "A" # không bao giờ tới được
print(rank) # B
950 lớn hơn 500 nên dừng ở nhánh đầu, không bao giờ xét tới 900. Sắp điều kiện từ hẹp tới rộng: >= 900 trước, >= 500 sau.
Một lỗi khác là dùng nhiều if riêng rẽ khi các trường hợp loại trừ nhau:
hp = 80
if hp > 70:
print("Khỏe")
if hp > 30:
print("Bị thương")
# Khỏe
# Bị thương
Cả hai if đều được kiểm tra độc lập, nên in cả hai dòng. Đổi if thứ hai thành elif là đúng.
if lồng nhau
Đặt if trong if được, nhưng lồng sâu khó đọc. Thường gộp bằng and sẽ gọn hơn:
has_key = True
level = 12
# lồng nhau
if has_key:
if level >= 10:
print("Mở cổng")
# gộp lại, cùng kết quả
if has_key and level >= 10:
print("Mở cổng")
Điều kiện một dòng
Khi chỉ cần chọn một trong hai giá trị, viết gọn trên một dòng:
hp = 15
status = "Nguy kịch" if hp < 20 else "Ổn"
print(status) # Nguy kịch
Đọc là: status bằng "Nguy kịch" nếu hp < 20, không thì bằng "Ổn". Chỉ dùng cho trường hợp ngắn, dài quá thì quay về if else bình thường.
match (Python 3.10 trở lên)
Khi so một giá trị với nhiều giá trị cố định, chuỗi elif dài dòng. match gọn hơn:
command = "attack"
match command:
case "attack":
print("Vung kiếm!") # Vung kiếm!
case "defend":
print("Giơ khiên")
case "run" | "flee":
print("Bỏ chạy")
case _:
print("Lệnh không hợp lệ")
- Mỗi
caselà một giá trị để so. |gộp nhiều giá trị vào mộtcase: gõ "run" hay "flee" đều bỏ chạy.case _:bắt mọi trường hợp còn lại, giốngelse.- Khớp
casenào thì chạycaseđó rồi thoát, không rơi xuốngcasesau.
match làm được nhiều hơn thế (tách tuple, list, dict), nhưng so giá trị như trên là đủ dùng cho người mới. Máy chạy Python cũ hơn 3.10 sẽ báo SyntaxError ở dòng match.
Bài tập
Viết chương trình xếp hạng theo điểm: từ 1000 trở lên là "S", từ 800 là "A", từ 500 là "B", còn lại là "C". Thử với score = 820. Sau đó dùng match để in phần thưởng: S được "Rương vàng", A được "Rương bạc", các hạng khác được "Bình máu".
Xem đáp án
score = 820
if score >= 1000:
rank = "S"
elif score >= 800:
rank = "A"
elif score >= 500:
rank = "B"
else:
rank = "C"
match rank:
case "S":
reward = "Rương vàng"
case "A":
reward = "Rương bạc"
case _:
reward = "Bình máu"
print(rank, reward) # A Rương bạc