Python cơ bản
Python hướng đối tượng
Python nâng cao
Quảng cáo

Cấu trúc điều kiện if trong Python

Trong hướng dẫn này các bạn sẽ học cách sử dụng cấu trúc điều kiện IF trong Python

Trong một chương trình, bình thường các lệnh sẽ lần lượt được thực hiện theo thứ tự xuất hiện của nó trong file code. Nếu chỉ thực thi lệnh như vậy các chương trình sẽ rất hạn chế. Vì vậy người ta đưa vào các cấu trúc điều khiển có tác dụng làm tham đổi trật tự thực thi lệnh trong chương trình.

Ví dụ, bạn chỉ thực thi lệnh khi đáp ứng một điều kiện nào đó. Bạn cũng có thể muốn lặp đi lặp lại việc thực hiện một nhóm lệnh. Trường hợp thứ nhất người ta gọi là rẽ nhánh, trường hợp thứ hai gọi là vòng lặp.

Python có các cấu trúc điều khiển rẽ nhánh và các cấu trúc lặptương tự như các ngôn ngữ khác. Trong bài học này chúng ta sẽ xem xét cách sử dụng cấu trúc lặp if-elif-else.

Ví dụ minh họa về cấu trúc IF

Tạo file equation.py với code như sau:

Ví dụ

from math import sqrt # sử dụng hàm tính căn sqrt trong module math

print('--- EQUATION SOLVER ---')

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))

d = b*b - 4*a*c

if d >= 0:
    print('THERE ARE REAL SOLUTIONS:')
    x1 = (-b + sqrt(d))/(2*a)
    x2 = (-b - sqrt(d))/(2*a)
    print(f'x1 = {x1}')
    print(f'x2 = {x2}')
else:
    print('THERE ARE COMPLEX SOLUTIONS BUT I CANNOT SHOW YOU.')

input('\nThank you! Press enter to quit ...')

Chạy script trên ở dạng chương trình console (click đúp vào file equation.py hoặc click phải -> Open with -> Python) bạn thu được kết quả như sau:

-- EQUATION SOLVER ---
a = 1
b = 5
c = 3
THERE ARE REAL SOLUTIONS:
x1 = -0.6972243622680054
x2 = -4.302775637731995

Thank you! Press enter to quit ...

Đây là một ví dụ đơn giản minh họa cách sử dụng cấu trúc rẽ nhánh if-else trong Python:

Ví dụ

if d >= 0:
    print('THERE ARE REAL SOLUTIONS:')
    # code khác 
else:
    print('THERE ARE COMPLEX SOLUTIONS BUT I CANNOT SHOW YOU.')

Cấu trúc rẽ nhánh IF

Cấu trúc rẽ nhánh quyết định xem những lệnh nào sẽ được thực hiện căn cứ vào giá trị (kiểu bool) của một biểu thức điều kiện.
Decision making statements in Python

Như trong ví dụ trên, nếu d >= 0 (biểu thức logic điều kiện) thì chúng ta tính nghiệm thực của phương trình và in ra kết quả. Nếu d < 0 thì chỉ thông báo là có nghiệm phức nhưng không tính toán được (vì hàm sqrt của Python không chấp nhận đối số âm).

Cấu trúc này làm thay đổi luồng thực thi (trật tự thực hiện lệnh) của chương trình. Trật tự thực hiện lệnh phụ thuộc vào giá trị của biểu thức điều kiện. Có những lệnh sẽ không được thực hiện.

Cú pháp cơ bản của cấu trúc này như sau:

if :
...
# khối code
...

Ví dụ

age = int(input('Your age: '))
if(age >= 18):
    print('Welcome!')
    print(f'Your birth year is {2020-age}')

name = input('Your name: ')
if(name.lower() == 'donald'):
    print('Mr. President!')
    print('Welcome to heaven!')

Biểu thức điều kiện là một biểu thức có kiểu kết quả là bool. Phần if : được gọi là header (tiêu đề), phần khối code được gọi là suite (thân). Tổ hợp header suite được gọi là một clause (mệnh đề).

python-if-elseif

Phần suite là bắt buộc. Tất cả lệnh trong suite phải viết với cùng số thụt đầu dòng. Số lượng thụt đầu dòng không bắt buộc nhưng thường quy ước là 1 thụt đầu dòng = 4 space. Các IDE đều hỗ trợ viết thụt đầu dòng tự động. Bạn cũng có thể tự thụt đầu dòng bằng phím tab hoặc space.

Nếu vô tình làm thay đối thụt đầu dòng bạn sẽ gặp lỗi cú pháp:

Lỗi cú pháp python

Mệnh đề elif và else

Trong cấu trúc rẽ nhánh đơn giản nhất bạn chỉ cần một mệnh đề if là đủ.

Hãy giả sử bạn viết script kiểm tra tuổi đi học theo các nấc sau: (1) dưới 6 tuổi -> trẻ mầm non, (2) từ 6 đến 12 -> học sinh tiểu học, (3) từ 12 đến 15 -> học sinh trung học cơ sở, (4) từ 16 đến 18 -> học sinh trung học, (5) trên 18 tuổi -> đại học / đi làm.

Dĩ nhiên bạn có thể viết 5 lệnh if:

age = int(input('Your age: '))

Ví dụ

if(0 < age < 6):
    print('Mầm non')
if(6 <= age < 12):
    print('Tiểu học')
if(12 <= age < 15):
    print('Trung học cơ sở')
if(15 <= age < 18):
    print('Trung học phổ thông')
if(18 <= age):
    print('Đại học / đi làm')

Cách sử dụng này không sai nhưng có vấn đề. Ví dụ, nếu bạn nhập giá trị 14, Python sẽ kiểm tra tất cả các cấu trúc if. Mặc dù lệnh ở cấu trúc if(12 <= age < 15) được thực thi, Python tiếp tục kiểm tra cả 2 cấu trúc if còn lại. Điều này dẫn đến làm thừa việc.

Giờ hãy điều chỉnh lại như sau:

Ví dụ

age = int(input('Your age: '))

if(0 < age < 6):
    print('Mầm non')
elif(6 <= age < 12):
    print('Tiểu học')
elif(12 <= age < 15):
    print('Trung học cơ sở')
elif(15 <= age < 18):
    print('Trung học phổ thông')
elif(18 <= age <= 100):
    print('Đại học / đi làm')
else:
    print('Bạn còn sống không đấy?')

Trong đoạn script này chúng ta vận dụng hai mệnh đề khác của cấu trúc if: mệnh đề elif và else.

Giả sử bạn nhập giá trị 14. Python sẽ làm như sau:

Kiểm tra mệnh đề if -> bỏ qua, vì age nằm ngoài khoảng (0, 6);
Kiểm tra mệnh đề elif(6 <= age < 12) -> bỏ qua, vì age nằm ngoài khảng [6, 12)
Kiểm tra mệnh đề elif(12 <= age < 15) -> thực hiện, vì age nằm trong khoảng [12, 15)
Bỏ qua hết các mệnh còn lại.

Đây là lợi thế của các mệnh đề elif: nếu một mệnh đề phù hợp và được thực hiện, các mệnh đề còn lại bị bỏ qua.

Giả sử bạn nhập giá trị 101 hoặc -1. Theo logic trên, Python sẽ kiểm tra mệnh đề if và tất cả các mệnh đề elif. Tuy nhiên nó không tìm được mệnh đề phù hợp. Khi này Python sẽ thực hiện mệnh đề else.

Mệnh đề else cần viết cuối cùng trong danh sách. Nó là mệnh đề sẽ thực hiện nếu tất cả các mệnh đề khác không phù hợp. Trong ví dụ của chúng ta, trường hợp giá trị tuổi nhỏ hơn 0 hoặc lớn hơn 100 là sẽ được thực hiện trong mệnh đề else.

Các cấu trúc if-elif-else lồng nhau

Ví dụ

age = int(input("Your age: "))
gender = input("Gender (male/female): ")
name = input("Your name: ")

if(age >= 18):
    print('Your age a legal.')
    if(name.isalpha()):
        if(gender.lower() == "male"):
            print(f'Welcome, Mr. {name}!')
        elif(gender.lower() == "female"):
            print(f'Welcome, lady {name}!')
        else:
            print(f'Welcome, {name}')
    else:
        print('Sorry, who are you?')
else:
    print('You are too young to come here!')

Trong ví dụ này bạn yêu cầu người dùng nhập tuổi, họ và giới tính.

Đầu tiên bạn kiểm tra tuổi. Nếu người dùng trên 18 tuổi, bạn tiếp tục kiểm tra tên. Nếu nười dùng nhập tên (name.isalpha()), bạn tiếp tục kiểm tra giới tính. Nếu là name (male) sẽ in ra lời chào ‘Welcome, Mr.’, nếu là nữ sẽ in lời chào ‘Welcome, lady’, nếu không chỉ định giới tính thì chỉ in ra lời chào ‘Welcome’.

Nếu người dùng không cung cấp tên thì hỏi lại ‘Sorry, who are you?’. Nếu tuổi dưới 18 thì in thông báo ‘You are too young to come here!’.

Đây là ví dụ về cách đặt các lệnh if-elif-else lồng nhau.

Khi sử dụng các lệnh lồng nhau đặc biệt lưu ý đến thụt đầu dòng: các lệnh nằm trong cùng một suite phải có cùng thụt đầu dòng như nhau.

Từ khóa pass

Đây là từ khóa tương đối lạ với các bạn học C. Từ khóa này được đưa ra do đặc thù của Python khi viết code block.

Hãy cùng thực hiện một ví dụ đơn giản sau:

Ví dụ

age = int(input('Your age: '))
if(age >= 18):
    print('Welcome!')
else:

print('Goodbye!')

Bạn sẽ gặp ngay lỗi cú pháp (báo ở dòng lệnh print(‘Goodbye!’)): expected an indented block.

Đây là điều tương đối lạ với các bạn đã học C (và các ngôn ngữ tương tự).

Trong Python, các lệnh như if, while, for, khai báo hàm, v.v., được gọi là các lệnh phức hợp (compound statement).

Mỗi lệnh phức hợp chứa một hoặc nhiều mệnh đề (clause). Như cấu trúc if có thể có nhiều mệnh đề tương ứng với if, các elif, và else.

Mỗi clause tạo ra từ một header và một suite. Ví dụ, clause tương ứng với else có header là else: và suite là khối code nằm sau else:. Suite là khối code bắt buộc phải có trong clause. Bạn không thể viết header mà không có suite đi kèm.

Vậy nếu như bạn không muốn xử lý gì trong clause thì sao. Giả sử, trong trường hợp mệnh đề else bạn không muốn xử lý gì cả nhưng vẫn muốn viết nó, hoặc trong trường hợp tạm thời bạn chưa viết được code xử lý cho nó.

Từ khóa pass được sử dụng trong những tình huống như thế này:

Ví dụ

age = int(input('Your age: '))
if(age >= 18):
    print('Welcome!')
else:
    pass
print('Goodbye!')

Khi này bạn vẫn có thể giữ được mệnh đề else nhưng nó sẽ không làm gì hết. Từ khóa pass được tạo ra chỉ đơn thuần là để đáp ứng yêu cầu cú pháp của Python: mỗi mệnh đề phải có đủ header và suite. Từ khóa pass đóng vai trò là một suite hình thức (không làm gì hết).

Đối với cấu trúc if, từ khóa pass có vẻ hơi vô ích. Tuy nhiên, trong cấu trúc xử lý ngoại lệ bạn sẽ thấy cần đến nó hơn.

Từ khóa pass không phải là đặc thù của cấu trúc if-elif-else. Đây là từ khóa xuất phát từ cấu trúc chung của các lệnh phức hợp trong Python.
Kết luận

Bài học này đã hướng dẫn chi tiết cách sử dụng cấu trúc rẽ nhánh if-elif-else trong Python. Nhìn chung ý tưởng và cú pháp của cấu trúc này khá gần với các ngôn ngữ lập trình khác.

Tuy nhiên cần lưu ý về căn lề (thụt đầu dòng) của code trong suite của mỗi clause. Các lệnh trong cùng một suite mà căn lề lệch sẽ bị lỗi cú pháp.

Ngoài ra Python cũng sử dụng từ khóa pass để tạo ra một dummy suite (suite không làm gì cả) để phù hợp với cú pháp của ngôn ngữ.

Bài viết này đã giúp ích cho bạn?

Advertisements