if, elif, else
Bạn sẽ học được
- Cấu trúc
if/elif/elsevà thứ tự đánh giá. - Toán tử so sánh, nối chuỗi so sánh,
and/or/not. - Vì sao thứ tự các nhánh quyết định kết quả.
- Toán tử ba ngôi và biểu thức điều kiện.
- Các lỗi logic thường gặp khi phân loại dữ liệu.
Khái niệm cốt lõi
Câu lệnh điều kiện chọn nhánh dựa trên giá trị đúng/sai:
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 50:
grade = "D"
else:
grade = "F"
print(grade)BCách hoạt động: Python kiểm tra từ trên xuống, dừng ở nhánh đầu tiên đúng. 85 >= 90 sai; 85 >= 80 đúng → gán "B" và bỏ qua mọi nhánh còn lại. else chạy khi không nhánh nào đúng và là tuỳ chọn.
Thụt lề xác định thân nhánh. Có thể dùng một dòng khi thân chỉ có một lệnh:
if score >= 50: print("Đạt")Nhưng với nhánh nhiều lệnh hoặc cần debug, viết đầy đủ dễ đọc hơn.
Toán tử so sánh
| Toán tử | Nghĩa |
|---|---|
== | Bằng |
!= | Khác |
<, <=, >, >= | Nhỏ hơn, nhỏ hơn hoặc bằng, lớn hơn, lớn hơn hoặc bằng |
Python cho phép nối chuỗi so sánh, đọc như toán học:
age = 25
print(18 <= age < 65)TrueTương đương 18 <= age and age < 65 nhưng chỉ đánh giá age một lần. Với biểu thức có hàm, điều này tránh gọi hàm hai lần.
So sánh chuỗi theo thứ tự từ điển Unicode:
print("An" < "Bình")
print("a" < "A")True
FalseChữ thường đứng sau chữ hoa trong bảng mã, nên "a" < "A" là False. Đừng dựa vào so sánh chuỗi để sắp xếp tên người theo alphabet tiếng Việt — cần chuẩn hoá và có thể cần thư viện locale/collate.
Kết hợp điều kiện
age = 25
income = 15_000_000
has_job = True
if age >= 18 and income >= 10_000_000:
print("Đủ điều kiện mở thẻ")
if not has_job or age < 18:
print("Cần bổ sung hồ sơ")
else:
print("Hồ sơ hợp lệ")and đúng khi cả hai đúng; or đúng khi một trong hai đúng; not đảo giá trị. Thứ tự ưu tiên: not > and > or. Khi trộn, dùng ngoặc để người đọc không phải nhớ:
if (age >= 18 and has_job) or income >= 30_000_000:
...Hai cách viết sau không tương đương:
if age >= 18 and age <= 65: ... # cả hai
if 18 <= age <= 65: ... # cách viết gọn, cùng nghĩa
if age >= 18 or age <= 65: ... # gần như luôn đúng — lỗi logicNhánh thứ ba là lỗi kinh điển: mọi tuổi đều thoả một trong hai vế, nên điều kiện luôn đúng.
and / or trả về giá trị, không chỉ True/False
Đây là chi tiết quan trọng của Python:
print(0 and "x")
print("" or "mặc định")
print("An" and "Bình")0
mặc định
Bìnhand trả toán hạng đầu tiên nếu nó "sai", ngược lại trả toán hạng cuối. or trả toán hạng đầu tiên nếu nó "đúng", ngược lại trả toán hạng cuối. Nhờ vậy có thể viết giá trị mặc định:
name = user_input or "Khách"Nhưng cẩn thận: nếu user_input là 0 hoặc "" — giá trị hợp lệ trong nhiều ngữ cảnh — biểu thức sẽ thay bằng mặc định. Chương truthiness sẽ phân tích kỹ.
Lồng nhánh và thoát sớm
Có thể lồng if trong if, nhưng lồng sâu khó đọc:
def xep_loai(score, attendance):
if score >= 50:
if attendance >= 0.8:
return "Đạt"
else:
return "Thiếu chuyên cần"
else:
return "Không đạt"Cách viết thoát sớm phẳng hơn và dễ kiểm thử:
def xep_loai(score, attendance):
if score < 50:
return "Không đạt"
if attendance < 0.8:
return "Thiếu chuyên cần"
return "Đạt"Mỗi điều kiện loại một trường hợp và thoát; phần còn lại là trường hợp bình thường. Quy tắc thực dụng: nếu thân else cũng dài, hãy đảo điều kiện và thoát sớm.
Toán tử ba ngôi
Khi chỉ cần chọn một trong hai giá trị:
status = "Đạt" if score >= 50 else "Không đạt"
print(status)Cú pháp: A if dieu_kien else B. Đọc là "A nếu điều kiện, ngược lại B". Chỉ dùng khi ngắn; lồng ba ngôi vào nhau làm code khó đọc và dễ sai thứ tự.
Thực hành
- Viết bảng xếp loại A/B/C/D/F theo điểm, thử với 95, 85, 72, 50, 49.
- Kiểm tra
18 <= age < 65với ba giá trị. - Viết điều kiện mở thẻ: tuổi từ 18, thu nhập từ 10 triệu, có việc làm.
- Cố ý dùng
age >= 18 or age <= 65và giải thích vì sao luôn đúng. - Viết lại hàm lồng nhánh thành thoát sớm.
- Dùng toán tử ba ngôi để gán
status.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
SyntaxError ở if x = 5 | Nhầm gán với so sánh | Dùng == |
| Nhánh không bao giờ chạy | Nhánh trước quá rộng | Sắp từ hẹp đến rộng |
| Điều kiện luôn đúng | Dùng or thay and | Kiểm tra logic từng vế |
0.1 + 0.2 == 0.3 sai | Sai số nhị phân | So sánh với dung sai |
and trả 0 thay vì False | and/or trả toán hạng | Bọc bool() nếu cần đúng/sai |
else chạy ngoài ý muốn | Thụt lề sai | Kiểm tra khối lệnh |
| Code lồng quá sâu | Nhiều if lồng nhau | Thoát sớm |
Tóm tắt
if/elif/elsedừng ở nhánh đúng đầu tiên; thứ tự nhánh là một phần logic.- Nối so sánh
18 <= age < 65gọn và chỉ đánh giá một lần. and/ortrả về toán hạng, không chỉTrue/False.- Thoát sớm giảm lồng nhánh và dễ kiểm thử.
A if dieu_kien else Bcho chọn giá trị ngắn gọn.
Dùng ← → để chuyển bài