Bài 2.1. Cấu trúc điều kiện trong Python (if/else)

Bài 2.1. Cấu trúc điều kiện trong Python (if/else)
Chào mừng các bạn đến với bài học tiếp theo trong hành trình chinh phục Python! Hôm nay, chúng ta sẽ cùng nhau khám phá một trong những khái niệm nền tảng và cực kỳ quan trọng trong bất kỳ ngôn ngữ lập trình nào: Cấu trúc điều kiện. Cụ thể hơn, chúng ta sẽ tìm hiểu về bộ ba quyền lực if
, else
, và elif
trong Python.
Hãy tưởng tượng trong cuộc sống hàng ngày, chúng ta liên tục phải đưa ra quyết định dựa trên các điều kiện khác nhau: Nếu trời mưa, thì mang ô, ngược lại thì không cần. Nếu đói bụng, thì đi ăn. Lập trình cũng vậy! Máy tính cần biết cách "ra quyết định" dựa trên những điều kiện mà chúng ta đặt ra. Đó chính là lúc cấu trúc điều kiện if
/else
phát huy tác dụng.
1. Câu lệnh if
- Nếu điều này đúng...
Câu lệnh if
là dạng cơ bản nhất của cấu trúc điều kiện. Nó cho phép bạn thực thi một khối lệnh chỉ khi một điều kiện cụ thể là đúng (evaluate to True
).
Cú pháp:
if <điều_kiện>:
# Khối lệnh sẽ được thực thi nếu điều_kiện là True
# Lưu ý: Khối lệnh này phải được thụt lề vào trong!
print("Điều kiện đúng!")
# ... các lệnh khác ...
<điều_kiện>
: Đây là một biểu thức logic sẽ được Python đánh giá làTrue
(đúng) hoặcFalse
(sai). Ví dụ:x > 5
,name == "Python"
,is_valid == True
.- Dấu hai chấm (
:
) ở cuối câu lệnhif
là bắt buộc. - Quan trọng: Khối lệnh bên trong
if
(những dòng code sẽ chạy nếu điều kiện đúng) phải được thụt lề so với dòngif
. Đây là cách Python xác định phạm vi của khối lệnh. Thường thì chúng ta thụt lề bằng 4 dấu cách.
Ví dụ:
Hãy xem một ví dụ đơn giản: kiểm tra xem một số có lớn hơn 10 không.
# Khai báo một biến số
so = 15
# Kiểm tra xem biến 'so' có lớn hơn 10 không
if so > 10:
print(f"Số {so} đúng là lớn hơn 10.")
print("Khối lệnh bên trong if đã được thực thi!")
print("Dòng này luôn được thực thi, bất kể điều kiện if.")
Giải thích:
- Chúng ta gán giá trị
15
cho biếnso
. - Câu lệnh
if so > 10:
kiểm tra xem giá trị củaso
(là 15) có lớn hơn 10 hay không. - Vì
15 > 10
là đúng (True
), nên khối lệnh được thụt lề bên dướiif
sẽ được thực thi. Kết quả là hai dòngprint
bên trongif
được hiển thị. - Dòng
print
cuối cùng không được thụt lề, nó nằm ngoài khốiif
, nên nó sẽ luôn luôn được thực thi sau khi khốiif
(hoặc không) được kiểm tra xong.
Thử thay đổi giá trị so
thành 5
và chạy lại xem sao nhé! Bạn sẽ thấy rằng các dòng print
bên trong if
sẽ không được thực thi nữa.
2. Câu lệnh else
- Ngược lại thì...
Câu lệnh if
rất hữu ích, nhưng thường thì chúng ta không chỉ muốn làm gì đó nếu điều kiện đúng, mà còn muốn làm một việc khác nếu điều kiện đó sai. Đó là lúc else
xuất hiện.
else
được sử dụng kết hợp với if
. Khối lệnh bên trong else
sẽ được thực thi chỉ khi điều kiện của if
là False
.
Cú pháp:
if <điều_kiện>:
# Khối lệnh thực thi nếu điều_kiện là True
print("Điều kiện đúng!")
else:
# Khối lệnh thực thi nếu điều_kiện là False
print("Điều kiện sai!")
else
phải đi liền sau khối lệnh củaif
(hoặcelif
, chúng ta sẽ nói đến sau).else
không có điều kiện riêng của nó; nó đơn giản là trường hợp "còn lại".- Giống như
if
, khối lệnh củaelse
cũng phải được thụt lề.
Ví dụ:
Mở rộng ví dụ trước: kiểm tra xem một số là dương hay không dương (tức là bằng 0 hoặc âm).
# Khai báo một biến số
so = -5
# Kiểm tra xem số có dương không
if so > 0:
print(f"Số {so} là số dương.")
else:
# Nếu điều kiện so > 0 là False, khối lệnh này sẽ chạy
print(f"Số {so} không phải là số dương (có thể là 0 hoặc âm).")
print("Kiểm tra hoàn tất.")
Giải thích:
so
được gán giá trị-5
.if so > 0:
kiểm tra-5 > 0
. Điều này là sai (False
).- Vì điều kiện
if
làFalse
, Python sẽ bỏ qua khối lệnh củaif
và nhảy tới khối lệnh củaelse
. - Khối lệnh bên trong
else
được thực thi, in ra: "Số -5 không phải là số dương..." - Dòng
print
cuối cùng (ngoài cấu trúcif/else
) được thực thi.
Hãy thử với so = 20
và so = 0
để xem kết quả thay đổi thế nào.
3. Câu lệnh elif
- Nếu không phải cái này, thì thử cái kia...
Đôi khi, chúng ta có nhiều hơn hai khả năng cần kiểm tra. Ví dụ: kiểm tra xem một số là dương, âm, hay bằng không. Chỉ dùng if
và else
thì chưa đủ linh hoạt. Đây là lúc elif
(viết tắt của "else if") tỏa sáng.
elif
cho phép bạn kiểm tra một điều kiện mới nếu điều kiện if
trước đó là False
. Bạn có thể có nhiều elif
liên tiếp.
Cú pháp:
if <điều_kiện_1>:
# Thực thi nếu điều_kiện_1 là True
print("Điều kiện 1 đúng.")
elif <điều_kiện_2>:
# Thực thi nếu điều_kiện_1 là False VÀ điều_kiện_2 là True
print("Điều kiện 1 sai, nhưng điều kiện 2 đúng.")
elif <điều_kiện_3>:
# Thực thi nếu điều_kiện_1 và 2 đều False VÀ điều_kiện_3 là True
print("Điều kiện 1, 2 sai, nhưng điều kiện 3 đúng.")
# ... có thể có nhiều elif khác ...
else:
# Thực thi nếu TẤT CẢ các điều kiện if/elif ở trên đều là False
print("Tất cả các điều kiện trên đều sai.")
Điểm quan trọng:
- Python sẽ kiểm tra các điều kiện từ trên xuống dưới (
if
->elif
->elif
-> ...). - Ngay khi gặp một điều kiện đúng (
True
), khối lệnh tương ứng sẽ được thực thi, và toàn bộ phần còn lại của cấu trúcif/elif/else
sẽ bị bỏ qua. - Khối
else
cuối cùng (nếu có) là tùy chọn. Nó sẽ chỉ chạy nếu tất cả các điều kiệnif
vàelif
trước đó đều làFalse
.
Ví dụ: Phân loại số (dương, âm, hoặc bằng không).
# Nhập số từ người dùng
try:
# Chuyển đổi input thành số nguyên
so = int(input("Nhập một số nguyên: "))
# Bắt đầu kiểm tra
if so > 0:
print(f"Số {so} là số dương.")
elif so < 0:
print(f"Số {so} là số âm.")
else: # Trường hợp duy nhất còn lại là so == 0
print(f"Số bạn nhập là số 0.")
except ValueError:
print("Đầu vào không hợp lệ. Vui lòng nhập một số nguyên.")
Giải thích:
- Chương trình yêu cầu người dùng nhập một số và cố gắng chuyển đổi nó thành số nguyên (
int
). Chúng ta dùngtry-except
để xử lý trường hợp người dùng nhập không phải số. - Kiểm tra 1 (
if so > 0
): Nếu số nhập vào lớn hơn 0 (ví dụ: người dùng nhập10
), dòngprint
đầu tiên sẽ chạy, và phầnelif
vàelse
sẽ bị bỏ qua. - Kiểm tra 2 (
elif so < 0
): Nếu điều kiệnif
ở trên làFalse
(ví dụ: người dùng nhập-5
), Python sẽ kiểm tra điều kiện này. Vì-5 < 0
làTrue
, dòngprint
thứ hai sẽ chạy, và phầnelse
sẽ bị bỏ qua. - Trường hợp còn lại (
else
): Nếu cả hai điều kiệnif
vàelif
đềuFalse
(điều này chỉ xảy ra khiso
không lớn hơn 0 và cũng không nhỏ hơn 0, tức làso == 0
), thì khối lệnh trongelse
sẽ được thực thi.
Đây là một cấu trúc cực kỳ phổ biến để xử lý các trường hợp loại trừ lẫn nhau.
4. Cấu trúc if
lồng nhau (Nested if
)
Bạn hoàn toàn có thể đặt một cấu trúc if/elif/else
bên trong một khối lệnh của một cấu trúc if/elif/else
khác. Đây được gọi là lồng nhau (nesting).
Ví dụ: Kiểm tra xem một người có đủ tuổi lái xe và có bằng lái hay không.
tuoi = 20
co_bang_lai = True # Giả sử người này có bằng lái
print(f"Kiểm tra người {tuoi} tuổi:")
if tuoi >= 18:
print("Đủ tuổi lái xe.")
# Kiểm tra tiếp bên trong nếu đủ tuổi
if co_bang_lai:
print("Và đã có bằng lái. Được phép lái xe!")
else:
print("Nhưng chưa có bằng lái. Không được phép lái xe.")
else:
print("Chưa đủ tuổi lái xe.")
Giải thích:
- Câu lệnh
if
bên ngoài (if tuoi >= 18:
) kiểm tra tuổi. - Nếu
tuoi >= 18
làTrue
, chương trình sẽ đi vào khối lệnh của nó. - Bên trong khối lệnh này, lại có một cấu trúc
if/else
khác (if co_bang_lai:
). Cấu trúc này chỉ được kiểm tra sau khi đã xác định là đủ tuổi. - Nếu
co_bang_lai
làTrue
, thông báo "Và đã có bằng lái..." được in. Ngược lại, thông báo "Nhưng chưa có bằng lái..." được in. - Nếu ngay từ đầu
tuoi >= 18
làFalse
, khối lệnh củaelse
bên ngoài sẽ được thực thi, và cấu trúcif/else
lồng bên trong sẽ không bao giờ được chạy tới.
Lưu ý: Việc lồng các cấu trúc if
quá sâu có thể làm code trở nên khó đọc và khó bảo trì. Hãy cân nhắc sử dụng elif
hoặc viết các hàm riêng biệt để giữ cho code rõ ràng hơn nếu logic trở nên quá phức tạp.
5. Toán tử logic (and
, or
, not
) trong điều kiện
Thường thì các điều kiện của bạn sẽ phức tạp hơn là chỉ so sánh hai giá trị. Bạn có thể kết hợp nhiều biểu thức logic lại với nhau bằng các toán tử:
and
: Trả vềTrue
chỉ khi cả hai vế đềuTrue
.or
: Trả vềTrue
nếu ít nhất một trong hai vế làTrue
.not
: Đảo ngược giá trị logic (True
thànhFalse
,False
thànhTrue
).
Ví dụ: Kiểm tra xem một số có nằm trong khoảng từ 10 đến 20 (bao gồm cả 10 và 20) hay không.
so = 15
# Kiểm tra xem so >= 10 VÀ so <= 20
if so >= 10 and so <= 20:
print(f"Số {so} nằm trong khoảng [10, 20].")
else:
print(f"Số {so} nằm ngoài khoảng [10, 20].")
# Ví dụ với 'or': Kiểm tra xem người dùng có phải admin HOẶC có quyền truy cập đặc biệt
username = "user123"
is_admin = False
has_special_access = True
if is_admin or has_special_access:
print(f"Người dùng {username} có quyền truy cập.")
else:
print(f"Người dùng {username} không có quyền truy cập.")
# Ví dụ với 'not': Kiểm tra nếu một danh sách KHÔNG rỗng
my_list = [1, 2, 3]
if not len(my_list) == 0: # Tương đương if len(my_list) != 0: hoặc đơn giản là if my_list:
print("Danh sách không rỗng.")
else:
print("Danh sách rỗng.")
Giải thích:
- Ví dụ đầu tiên dùng
and
để đảm bảo sốso
thỏa mãn cả hai điều kiện: lớn hơn hoặc bằng 10 và nhỏ hơn hoặc bằng 20. - Ví dụ thứ hai dùng
or
. Chỉ cần một trong hai điều kiệnis_admin
hoặchas_special_access
làTrue
, thì người dùng sẽ có quyền truy cập. - Ví dụ thứ ba dùng
not
để đảo ngược kết quả củalen(my_list) == 0
. Nếu danh sách không rỗng (len(my_list) == 0
làFalse
), thìnot False
sẽ làTrue
, và thông báo "Danh sách không rỗng" được in. Lưu ý: Trong Python, các đối tượng collection rỗng (list, tuple, dict, set, string rỗng) được coi làFalse
trong ngữ cảnh boolean, nên cách viếtif my_list:
thường gọn hơn.
Cấu trúc điều kiện if/elif/else
là một công cụ vô cùng mạnh mẽ giúp bạn điều khiển luồng thực thi của chương trình, làm cho code của bạn trở nên thông minh và linh hoạt hơn rất nhiều. Hãy thực hành thật nhiều với các ví dụ khác nhau để nắm vững cách sử dụng chúng nhé!
Comments