Python cơ bản – Bài 5: Câu lệnh if
- Python cơ bản – Bài 1: Giới thiệu series
- Python cơ bản – Bài 2: Biến và kiểu dữ liệu đơn giản
- Python cơ bản – Bài 3: Làm quen với list
- Python cơ bản – Bài 4: Làm việc với list
- Python cơ bản – Bài 5: Câu lệnh if
- Python cơ bản – Bài 6: Dictionary
- Python cơ bản – Bài 7: Nhập dữ liệu và vòng lặp while
- Python cơ bản – Bài 8: Hàm
- Python cơ bản – Bài 9: Class
- Python cơ bản – Bài 10: File và exception
Đến giờ, chương trình của mình luôn chạy giống nhau, từ dòng đầu tới dòng cuối. Nhưng chương trình thực tế phải phản ứng theo tình huống: người dùng nhập sai mật khẩu thì báo lỗi, khách dưới 4 tuổi thì miễn vé, món khách gọi đã hết thì xin lỗi. Bài này giới thiệu điều kiện và câu lệnh if để làm việc đó.
Bài này dành cho ai
Người mới bắt đầu, đã đọc bài 4 về vòng lặp for. Cần Python 3.14.
Một ví dụ
Có một list các hãng xe ô tô. Tên hãng thường viết hoa chữ cái đầu, riêng bmw phải viết hoa toàn bộ:
cars = ["audi", "bmw", "toyota", "vinfast"]
for car in cars:
if car == "bmw":
print(car.upper())
else:
print(car.title())Audi
BMW
Toyota
VinfastVới mỗi xe, chương trình kiểm tra car == "bmw". Đúng thì in chữ hoa, sai thì in kiểu title(). Phần còn lại của bài giải thích từng mảnh của ví dụ này.
Điều kiện
Phần cốt lõi của mọi câu lệnh if là một biểu thức cho ra True (đúng) hoặc False (sai), gọi là điều kiện. True thì Python chạy khối lệnh bên dưới if, False thì bỏ qua.
So sánh bằng và khác
car = "bmw"
print(car == "bmw")
print(car == "audi")True
FalseMột dấu = là gán: “đặt giá trị của car là "bmw"”. Hai dấu == là hỏi: “giá trị của car có bằng "bmw" không?”. Nhầm hai thứ này là lỗi rất hay gặp.
So sánh chuỗi phân biệt chữ hoa, chữ thường. Nếu không quan tâm hoa thường, hãy chuyển về chữ thường trước khi so sánh:
car = "Audi"
print(car == "audi")
print(car.lower() == "audi")
print(car)False
True
Audilower() không sửa giá trị gốc, nên car vẫn là "Audi". Các website dùng cách này để đảm bảo tên đăng nhập là duy nhất: Minh và minh được coi là một.
Để kiểm tra khác nhau, dùng !=:
requested_topping = "trứng chần"
if requested_topping != "hành":
print("Không cho hành nhé!")Không cho hành nhé!So sánh số
Số có đủ các phép so sánh: ==, !=, <, <=, >, >=.
age = 17
print(age == 18)
print(age < 18)
print(age <= 18)
print(age > 18)
print(age >= 18)False
True
True
False
FalseKết hợp nhiều điều kiện với and, or
and đúng khi cả hai điều kiện đều đúng. or đúng khi ít nhất một điều kiện đúng:
age_0 = 22
age_1 = 17
print(age_0 >= 18 and age_1 >= 18)
print(age_0 >= 18 or age_1 >= 18)
age_1 = 18
print(age_0 >= 18 and age_1 >= 18)False
True
TrueCó thể đặt từng điều kiện trong ngoặc cho dễ đọc: (age_0 >= 18) and (age_1 >= 18). Ngoặc không bắt buộc.
Kiểm tra giá trị có trong list không
Dùng in và not in:
requested_toppings = ["hành", "trứng chần", "quẩy"]
print("quẩy" in requested_toppings)
print("gầu" in requested_toppings)
banned_users = ["spammer01", "troll99"]
user = "minh"
if user not in banned_users:
print(f"{user.title()} được phép bình luận.")True
False
Minh được phép bình luận.Cách này tiện khi bạn có một danh sách giá trị đặc biệt và cần kiểm tra một giá trị có nằm trong đó không, ví dụ tên đăng nhập đã có người dùng chưa.
Giá trị boolean
True và False là giá trị boolean, và điều kiện còn được gọi là biểu thức boolean. Giá trị boolean thường được lưu vào biến để theo dõi trạng thái, ví dụ game có đang chạy không, người dùng có quyền sửa bài không:
game_active = True
can_edit = FalseCâu lệnh if
if đơn giản
Một điều kiện, một hành động:
age = 19
if age >= 18:
print("Bạn đủ tuổi thi bằng lái xe máy.")
print("Bạn đã đăng ký thi chưa?")Bạn đủ tuổi thi bằng lái xe máy.
Bạn đã đăng ký thi chưa?Giống vòng lặp for, mọi dòng thụt lề sau if thuộc khối lệnh của if. Điều kiện sai thì cả khối bị bỏ qua. Với age = 15, chương trình này không in gì.
if-else
else là việc cần làm khi điều kiện sai:
age = 15
if age >= 18:
print("Bạn đủ tuổi thi bằng lái xe máy.")
else:
print("Bạn chưa đủ tuổi thi bằng lái xe máy.")
print("Đủ 18 tuổi rồi quay lại nhé!")Bạn chưa đủ tuổi thi bằng lái xe máy.
Đủ 18 tuổi rồi quay lại nhé!Với if-else, luôn có đúng một trong hai khối được chạy.
Chuỗi if-elif-else
Khi có nhiều hơn hai trường hợp, dùng elif (viết tắt của else if). Ví dụ một khu vui chơi bán vé theo độ tuổi:
- Dưới 4 tuổi: miễn phí.
- Từ 4 đến dưới 18 tuổi: 50.000 đồng.
- Từ 18 tuổi trở lên: 100.000 đồng.
age = 12
if age < 4:
price = 0
elif age < 18:
price = 50_000
else:
price = 100_000
print(f"Giá vé của bạn là {price} đồng.")Giá vé của bạn là 50000 đồng.Python kiểm tra lần lượt từ trên xuống và dừng ở điều kiện đầu tiên đúng:
age < 4sai, chuyển xuốngelif.age < 18đúng, gánprice = 50_000rồi bỏ qua phần còn lại, kể cảelse.elsechỉ chạy khi mọi điều kiện phía trên đều sai.
Khối if-elif-else ở đây chỉ làm một việc là xác định giá vé, còn print() nằm ngoài và chạy một lần. So với việc đặt print() trong từng nhánh, cách này gọn hơn và dễ sửa hơn: muốn đổi câu thông báo, bạn chỉ sửa một chỗ.
Nhiều elif, và bỏ else
Có thể dùng bao nhiêu elif tùy ý. Giả sử khu vui chơi giảm giá cho người từ 65 tuổi:
age = 70
if age < 4:
price = 0
elif age < 18:
price = 50_000
elif age < 65:
price = 100_000
elif age >= 65:
price = 50_000
print(f"Giá vé của bạn là {price} đồng.")Giá vé của bạn là 50000 đồng.Ở đây mình dùng elif age >= 65 thay cho else. Python không bắt buộc phải có else. else bắt mọi trường hợp còn lại, kể cả dữ liệu sai hoặc không lường trước. Khi trường hợp cuối cùng có điều kiện rõ ràng, viết hẳn điều kiện đó ra bằng elif sẽ an toàn hơn.
Kiểm tra nhiều điều kiện độc lập
if-elif-else dừng ngay khi gặp điều kiện đúng đầu tiên. Nếu nhiều điều kiện có thể cùng đúng và bạn muốn xử lý tất cả, hãy dùng nhiều câu if riêng biệt:
requested_toppings = ["trứng chần", "quẩy"]
if "trứng chần" in requested_toppings:
print("Thêm trứng chần.")
if "hành" in requested_toppings:
print("Thêm hành.")
if "quẩy" in requested_toppings:
print("Thêm quẩy.")
print("\nPhở của bạn đây!")Thêm trứng chần.
Thêm quẩy.
Phở của bạn đây!Nếu đổi hai câu if sau thành elif, Python sẽ dừng sau “Thêm trứng chần.” và khách mất phần quẩy:
requested_toppings = ["trứng chần", "quẩy"]
if "trứng chần" in requested_toppings:
print("Thêm trứng chần.")
elif "hành" in requested_toppings:
print("Thêm hành.")
elif "quẩy" in requested_toppings:
print("Thêm quẩy.")
print("\nPhở của bạn đây!")Thêm trứng chần.
Phở của bạn đây!Tóm lại: chỉ muốn chạy một khối thì dùng if-elif-else, muốn chạy nhiều khối thì dùng nhiều if.
Dùng if với list
Xử lý phần tử đặc biệt
Quán phở in thông báo mỗi khi thêm một món vào tô. Nếu hết gầu thì phải báo khách:
requested_toppings = ["tái", "gầu", "trứng chần"]
for requested_topping in requested_toppings:
if requested_topping == "gầu":
print("Xin lỗi, hôm nay quán hết gầu.")
else:
print(f"Thêm {requested_topping}.")
print("\nPhở của bạn đây!")Thêm tái.
Xin lỗi, hôm nay quán hết gầu.
Thêm trứng chần.
Phở của bạn đây!Kiểm tra list có rỗng không
Khi list do người dùng tạo ra, bạn không thể chắc nó có phần tử. Đặt tên list vào if: list có ít nhất một phần tử thì điều kiện là True, list rỗng thì False:
requested_toppings = []
if requested_toppings:
for requested_topping in requested_toppings:
print(f"Thêm {requested_topping}.")
print("\nPhở của bạn đây!")
else:
print("Bạn muốn ăn phở không người lái à?")Bạn muốn ăn phở không người lái à?Dùng nhiều list
Khách có thể gọi cả những thứ quán không có. Kiểm tra từng món khách gọi với danh sách món quán có:
available_toppings = ["tái", "chín", "gầu", "nạm", "trứng chần", "quẩy", "hành"]
requested_toppings = ["tái", "phô mai", "quẩy"]
for requested_topping in requested_toppings:
if requested_topping in available_toppings:
print(f"Thêm {requested_topping}.")
else:
print(f"Xin lỗi, quán không có {requested_topping}.")
print("\nPhở của bạn đây!")Thêm tái.
Xin lỗi, quán không có phô mai.
Thêm quẩy.
Phở của bạn đây!Nếu thực đơn của quán cố định, available_toppings có thể là một tuple.
Trình bày câu lệnh if
PEP 8 chỉ có một khuyến nghị cho điều kiện: đặt một dấu cách hai bên toán tử so sánh. Viết if age < 4: thay vì if age<4:. Khoảng trắng không ảnh hưởng tới cách Python chạy, chỉ giúp code dễ đọc hơn.
Bài tập
Dự đoán kết quả: viết ít nhất 10 điều kiện, 5 cái cho
Truevà 5 cái choFalse. Trước mỗi điều kiện, in ra dự đoán của bạn:car = "vinfast" print("car == 'vinfast'? Mình đoán True.") print(car == "vinfast")car == 'vinfast'? Mình đoán True. TrueCác điều kiện nên có đủ: so sánh bằng và khác với chuỗi, dùng
lower(), so sánh số (==,!=,<,>,<=,>=),andvàor,invànot in.Đèn giao thông: gán cho biến
lightmột trong ba giá trị"xanh","vàng","đỏ".- Viết câu
if: nếu đèn xanh thì inĐược đi.. Chạy thử với một giá trị làm điều kiện đúng và một giá trị làm điều kiện sai. - Đổi thành
if-else: đèn xanh thìĐược đi., còn lại thìDừng lại.. - Đổi thành
if-elif-else: xanh thìĐược đi., vàng thìGiảm tốc độ., đỏ thìDừng lại.. Chạy thử cả ba màu.
- Viết câu
Các giai đoạn cuộc đời: gán tuổi cho biến
agevà dùngif-elif-elseđể in ra giai đoạn tương ứng: dưới 2 tuổi là em bé, 2 đến dưới 4 là trẻ mới biết đi, 4 đến dưới 13 là thiếu nhi, 13 đến dưới 20 là thiếu niên, 20 đến dưới 65 là người trưởng thành, từ 65 là người cao tuổi.Trái cây yêu thích: tạo list
favorite_fruitsgồm ba loại trái cây, ví dụ xoài, sầu riêng, chôm chôm. Viết năm câuifđộc lập, mỗi câu kiểm tra một loại trái cây. Loại nào có trong list thì in một câu, ví dụBạn mê sầu riêng thật đấy!.Chào admin: tạo list ít nhất năm tên đăng nhập, trong đó có
"admin". Duyệt list và chào từng người:adminthì inChào admin, bạn có muốn xem báo cáo hệ thống không?, người khác thì inChào Minh, cảm ơn bạn đã quay lại.. Thêm một câuifkiểm tra list rỗng: nếu rỗng thì inCần tìm thêm người dùng!. Xóa hết tên trong list để kiểm tra.Tên đăng nhập trùng: tạo list
current_usersgồm năm tên và listnew_usersgồm năm tên, trong đó một hai tên trùng vớicurrent_users. Với mỗi tên trongnew_users, in thông báo tên đã có người dùng hoặc tên còn trống. So sánh không phân biệt hoa thường: đã cóMinhthì không chấp nhậnMINH. Gợi ý: tạo một list chứa các tên trongcurrent_usersở dạng chữ thường.Xếp hạng: lưu các số từ 1 đến 9 trong một list. Duyệt list và dùng
if-elif-elseđể in thứ hạng: 1 làHạng nhất, 2 làHạng nhì, 3 làHạng ba, còn lại làHạng 4,Hạng 5, … mỗi hạng một dòng.
Tóm tắt
- Điều kiện cho ra
TruehoặcFalse. Các toán tử:==,!=,<,<=,>,>=,and,or,in,not in. =là gán,==là so sánh. So sánh chuỗi phân biệt hoa thường, dùnglower()khi cần bỏ qua.if,if-else,if-elif-else: Python chạy khối của điều kiện đúng đầu tiên rồi bỏ qua phần còn lại.elsekhông bắt buộc.- Cần xử lý mọi điều kiện đúng thì dùng nhiều câu
ifđộc lập. - List rỗng tương đương
Falsetrong điều kiện.
Bài sau giới thiệu dictionary, cách lưu dữ liệu theo cặp khóa – giá trị.
Tài liệu tham khảo
- Eric Matthes, Python Crash Course, 3rd edition, chương 5, No Starch Press, 2023.
- if Statements, Python tutorial.
- Comparisons và Truth Value Testing, Python documentation.