Câu 1Trong các đáp án sau, đáp án nào chạy khối của if not value:?
if / elif / else và rẽ nhánh nâng cao
Học câu lệnh điều kiện trong Python: phân nhánh nhiều với if / elif / else, toán tử ba ngôi và các mẫu kiểm tra nâng cao.
Những điều cơ bản về if và if not
if điều_kiện: chạy khối chỉ khi điều kiện là True — đây là cấu trúc rẽ nhánh cơ bản nhất. Để phủ định một điều kiện, hãy thêm not ở phía trước, như if not điều_kiện:.
not là toán tử đảo True và False, nên các diễn đạt như "khi không phải..." hay "khi không rỗng" có thể viết một cách tự nhiên.
# if: chỉ chạy khi điều kiện là True
is_logged_in = True
if is_logged_in:
print("Xin chào")
# Đầu ra: Xin chào
# if not: đảo điều kiện trước khi đánh giá
is_logged_in = False
if not is_logged_in:
print("Vui lòng đăng nhập")
# Đầu ra: Vui lòng đăng nhập
# Kết hợp với biểu thức so sánh
cart = []
if not cart:
print("Giỏ hàng của bạn đang trống")
# Đầu ra: Giỏ hàng của bạn đang trống
Viết rẽ nhánh nhiều nhánh với elif và else
Để xử lý nhiều nhánh, hãy dùng elif và else.
elif là viết tắt của else if — khi điều kiện if là False, Python sẽ thử điều kiện kế tiếp, và nếu không có cái nào khớp, else cuối cùng sẽ chạy.
Các điều kiện được đánh giá từ trên xuống dưới. Chỉ điều kiện đầu tiên trở thành True được chạy, phần còn lại bị bỏ qua. Nếu không có cái nào True, else chạy.
# Chọn chỉ dẫn dựa trên màu đèn tín hiệu
signal = "YELLOW"
if signal == "GREEN":
print("Đi tiếp")
elif signal == "YELLOW":
print("Đi chậm và cẩn thận")
elif signal == "RED":
print("Dừng lại")
else:
print("Tín hiệu không xác định")
# Đầu ra: Đi chậm và cẩn thận
elif được đánh giá từ trên xuống
Nếu bạn viết if age >= 0: ... elif age >= 20: ..., điều kiện rộng hơn đứng trước nên cái sau không bao giờ khớp. Khi rẽ nhánh nhiều nhánh, hãy liệt kê các điều kiện hẹp (chặt chẽ) hơn trước.
Dùng chính giá trị làm điều kiện (truthiness)
Điều kiện của if không bị giới hạn ở các biểu thức so sánh như == — bạn có thể đặt chính giá trị vào đó. Python sẽ chuyển nó thành bool ở phía sau hậu trường, xem "rỗng" hay 0 là False và mọi thứ khác là True.
| Kiểu | Được xem là False | Được xem là True (ví dụ) |
|---|---|---|
| int / float | 0, 0.0 | 1, -1, 3.14 |
| str | "" (chuỗi rỗng) | "a", "0" (mọi chuỗi không rỗng đều là True) |
| list / tuple / set | [], (), set() (collection rỗng) | [1], (0,), {0} |
| dict | {} (dict rỗng) | {"key": "value"} |
| None | None | (mọi giá trị khác None) |
Đặc điểm này cho phép bạn viết các kiểm tra như "đầu vào có rỗng không?" hay "giỏ hàng có gì không?" một cách rất gọn.
Thay vì if len(cart) > 0:, chỉ cần viết if cart: — ý nghĩa giống nhau. Đây là cách viết rất Pythonic.
# Không thực hiện tìm kiếm khi từ khóa rỗng
search_query = ""
if search_query:
print(f"Đang tìm: {search_query}")
else:
print("Vui lòng nhập từ khóa")
# Đầu ra: Vui lòng nhập từ khóa
# Chuyển sang thanh toán khi giỏ hàng có ít nhất một món
cart = ["apple", "bread"]
if cart:
print(f"Tiến hành với {len(cart)} món")
# Đầu ra: Tiến hành với 2 món
Viết if một dòng với toán tử ba ngôi
Khi tất cả những gì bạn cần là gán một trong hai giá trị dựa trên điều kiện, bạn không cần 4 dòng if / else — bạn có thể làm trong một dòng. Đây gọi là toán tử ba ngôi (hay biểu thức điều kiện). Cú pháp là giá_trị_nếu_true if điều_kiện else giá_trị_nếu_false.
# 4 dòng với if / else thông thường
age = 25
if age >= 20:
status = "người lớn"
else:
status = "vị thành niên"
# Một dòng với toán tử ba ngôi
status = "người lớn" if age >= 20 else "vị thành niên"
print(status) # người lớn
Bí quyết là chỉ dùng nó cho lựa chọn hai nhánh đơn giản. Khi điều kiện hoặc giá trị dài ra, hoặc bạn có ba nhánh trở lên, dùng if / elif / else thông thường sẽ dễ đọc hơn.
Kiểm tra khoảng có thể nối trực tiếp
Kiểm tra khoảng như "từ 0 đến 100" có thể viết bằng cách nối các toán tử so sánh thay vì dùng and. Kết quả đọc lên giống y một bất đẳng thức toán học, làm ý đồ rất rõ ràng.
score = 78
# Dùng and
if score >= 0 and score <= 100:
print("Điểm hợp lệ")
# Dạng nối (cùng ý nghĩa)
if 0 <= score <= 100:
print("Điểm hợp lệ")
Kiểm tra kiểu và giá trị (isinstance và is None)
Khi bạn muốn kiểm tra kiểu của giá trị mà một biến đang giữ, hãy dùng isinstance(giá_trị, kiểu). Truyền giá trị trước và kiểu sau — nếu giá trị là một instance của kiểu đó, hàm trả về True.
price = 980
user_name = "minh"
print(isinstance(price, int)) # True
print(isinstance(user_name, str)) # True
print(isinstance(price, str)) # False
# Kết hợp với if để chỉ tính khi là số
if isinstance(price, int) and price > 0:
tax_included = int(price * 1.1)
print(tax_included) # 1078
None là gì?
None là giá trị đặc biệt của Python mang nghĩa "không có giá trị". Nó đại diện cho những thứ như "kết quả chưa được lấy về", "trạng thái chưa khởi tạo", hay "thứ hàm trả về khi nó không trả về gì cả". Đây là giá trị duy nhất mang nghĩa "không có gì", khác với 0 hay chuỗi rỗng.
# Một hàm không trả về gì sẽ ngầm trả về None
def greet():
print("hello")
result = greet() # "hello" được in ra
print(result) # None
# Một giá trị khởi tạo mang nghĩa "chưa quyết định"
selected_user = None
print(selected_user) # None
Để kiểm tra một giá trị có phải là None hay không, cách Pythonic là dùng is None thay vì ==. Vì None là một object duy nhất trong chương trình, so sánh xem hai tham chiếu có trỏ tới cùng một object trong bộ nhớ hay không bằng is làm cho ý đồ rõ ràng hơn.
# Thông tin user từ API (giả sử chưa được lấy về)
user = None
if user is None:
print("Thông tin user chưa được tải")
else:
print(f"Xin chào, {user}")
# Đầu ra: Thông tin user chưa được tải
# Để kiểm tra "không phải None", dùng `is not None`
score = 0
if score is not None:
print(f"Điểm: {score}") # Điểm: 0
0 và None là hai thứ khác nhau
Viết if score: sẽ xem score == 0 cũng là False. Khi bạn cần phân biệt "chưa nhập (None)" với "0 điểm", hãy kiểm tra rõ ràng bằng if score is None: hoặc if score is not None:.
Kiểm tra nội dung collection với in / not in
Để kiểm tra một giá trị có nằm trong list hay không, dùng giá_trị in collection. Ngược lại — "không nằm trong" — là giá_trị not in collection. Nó hoạt động với list, tuple, set, và chuỗi, và với dict thì kiểm tra các key.
allowed_roles = ["admin", "editor", "member"]
current_role = "member"
if current_role in allowed_roles:
print("Cho phép truy cập")
else:
print("Từ chối truy cập")
# Đầu ra: Cho phép truy cập
# Kiểm tra một chuỗi con có xuất hiện trong chuỗi hay không
if "error" in "connection error: timeout":
print("Phát hiện dòng có lỗi")
# Với dict, `in` kiểm tra các key
user = {"name": "minh", "role": "admin"}
if "email" not in user:
print("Email chưa đăng ký")
Trong bài này, chúng ta đã học rẽ nhánh nâng cao với cơ bản của if / if not, logic nhiều nhánh với elif / else, truthiness xem giá trị rỗng và 0 là False, toán tử ba ngôi giá_trị_1 if điều_kiện else giá_trị_2, kiểm tra kiểu và giá trị với isinstance và is None, và kiểm tra collection với in / not in.
Trong bài tiếp theo, chúng ta sẽ học all() / any(), cho phép bạn kiểm tra liệu mọi phần tử trong list có thỏa điều kiện hay không trong một lệnh gọi duy nhất.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Đoạn code này in gì?age = 18
status = "người lớn" if age >= 20 else "vị thành niên"
print(status)
Câu 3Trong các đáp án sau, đáp án nào là cách được khuyến nghị nhất để kiểm tra một giá trị có phải None hay không?