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ặc False (sai). Ví dụ: x > 5, name == "Python", is_valid == True.
  • Dấu hai chấm (:) ở cuối câu lệnh ifbắ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òng if. Đâ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:

  1. Chúng ta gán giá trị 15 cho biến so.
  2. Câu lệnh if so > 10: kiểm tra xem giá trị của so (là 15) có lớn hơn 10 hay không.
  3. 15 > 10đúng (True), nên khối lệnh được thụt lề bên dưới if sẽ được thực thi. Kết quả là hai dòng print bên trong if được hiển thị.
  4. Dòng print cuối cùng không được thụt lề, nó nằm ngoài khối if, nên nó sẽ luôn luôn được thực thi sau khi khối if (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 ifFalse.

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ủa if (hoặc elif, 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ủa else 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:

  1. so được gán giá trị -5.
  2. if so > 0: kiểm tra -5 > 0. Điều này là sai (False).
  3. Vì điều kiện ifFalse, Python sẽ bỏ qua khối lệnh của if và nhảy tới khối lệnh của else.
  4. Khối lệnh bên trong else được thực thi, in ra: "Số -5 không phải là số dương..."
  5. Dòng print cuối cùng (ngoài cấu trúc if/else) được thực thi.

Hãy thử với so = 20so = 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 ifelse 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úc if/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ện ifelif 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:

  1. 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ùng try-except để xử lý trường hợp người dùng nhập không phải số.
  2. 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ập 10), dòng print đầu tiên sẽ chạy, và phần elifelse sẽ bị bỏ qua.
  3. Kiểm tra 2 (elif so < 0): Nếu điều kiện if ở 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 < 0True, dòng print thứ hai sẽ chạy, và phần else sẽ bị bỏ qua.
  4. Trường hợp còn lại (else): Nếu cả hai điều kiện ifelif đều False (điều này chỉ xảy ra khi so không lớn hơn 0 cũng không nhỏ hơn 0, tức là so == 0), thì khối lệnh trong else 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:

  1. Câu lệnh if bên ngoài (if tuoi >= 18:) kiểm tra tuổi.
  2. Nếu tuoi >= 18True, chương trình sẽ đi vào khối lệnh của nó.
  3. 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.
  4. Nếu co_bang_laiTrue, 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.
  5. Nếu ngay từ đầu tuoi >= 18False, khối lệnh của else bên ngoài sẽ được thực thi, và cấu trúc if/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ế đều True.
  • 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ành False, False thành True).

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:

  1. 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 nhỏ hơn hoặc bằng 20.
  2. Ví dụ thứ hai dùng or. Chỉ cần một trong hai điều kiện is_admin hoặc has_special_accessTrue, thì người dùng sẽ có quyền truy cập.
  3. Ví dụ thứ ba dùng not để đảo ngược kết quả của len(my_list) == 0. Nếu danh sách không rỗng (len(my_list) == 0False), 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ết if 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

There are no comments at the moment.