Bài 5.3. Python - Câu lệnh if

Bài 5.3. Python - Câu lệnh if
Khi bạn hiểu các kiểm tra điều kiện, bạn có thể bắt đầu viết các câu lệnh if. Có nhiều loại câu lệnh if khác nhau, và lựa chọn của bạn phụ thuộc vào số lượng điều kiện bạn cần kiểm tra. Bạn đã thấy một số ví dụ về câu lệnh if trong phần thảo luận về kiểm tra điều kiện, nhưng bây giờ hãy đi sâu hơn vào chủ đề này.
Câu lệnh if đơn giản
Loại câu lệnh if đơn giản nhất có một kiểm tra và một hành động:
if conditional_test:
do_something
Bạn có thể đặt bất kỳ kiểm tra điều kiện nào trong dòng đầu tiên và hầu như bất kỳ hành động nào trong khối thụt lề theo sau kiểm tra. Nếu kiểm tra điều kiện đánh giá là True, Python thực thi mã theo sau câu lệnh if. Nếu kiểm tra đánh giá là False, Python bỏ qua mã theo sau câu lệnh if.
Giả sử chúng ta có một biến đại diện cho tuổi của một người, và chúng ta muốn biết liệu người đó có đủ tuổi để bỏ phiếu hay không. Mã sau kiểm tra xem người đó có thể bỏ phiếu hay không:
age = 19
if age >= 18:
print("You are old enough to vote!")
Python kiểm tra xem giá trị của age
có lớn hơn hoặc bằng 18 hay không. Nó đúng, vì vậy Python thực thi lệnh print()
thụt lề:
You are old enough to vote!
Thụt lề đóng vai trò tương tự trong các câu lệnh if như trong các vòng lặp for. Tất cả các dòng thụt lề sau một câu lệnh if sẽ được thực thi nếu kiểm tra thành công, và toàn bộ khối các dòng thụt lề sẽ bị bỏ qua nếu kiểm tra không thành công.
Bạn có thể có bao nhiêu dòng mã tùy thích trong khối theo sau câu lệnh if. Hãy thêm một dòng đầu ra khác nếu người đó đủ tuổi để bỏ phiếu, hỏi xem người đó đã đăng ký bỏ phiếu chưa:
age = 19
if age >= 18:
print("You are old enough to vote!")
print("Have you registered to vote yet?")
Kiểm tra điều kiện thành công, và cả hai lệnh print()
đều được thụt lề, vì vậy cả hai dòng đều được in ra:
You are old enough to vote!
Have you registered to vote yet?
Nếu giá trị của age
nhỏ hơn 18, chương trình này sẽ không tạo ra đầu ra nào.
Câu lệnh if-else
Thường thì bạn sẽ muốn thực hiện một hành động khi kiểm tra điều kiện thành công và một hành động khác trong tất cả các trường hợp khác. Cú pháp if-else của Python làm cho điều này có thể. Một khối if-else tương tự như một câu lệnh if đơn giản, nhưng câu lệnh else cho phép bạn xác định một hành động hoặc một tập hợp các hành động được thực thi khi kiểm tra điều kiện thất bại.
Chúng ta sẽ hiển thị cùng một thông báo như trước nếu người đó đủ tuổi để bỏ phiếu, nhưng lần này chúng ta sẽ thêm một thông báo cho bất kỳ ai không đủ tuổi để bỏ phiếu:
age = 17
if age >= 18:
print("You are old enough to vote!")
print("Have you registered to vote yet?")
else:
print("Sorry, you are too young to vote.")
print("Please register to vote as soon as you turn 18!")
Nếu kiểm tra điều kiện thành công, khối mã thụt lề đầu tiên sẽ được thực thi. Nếu kiểm tra đánh giá là False, khối else sẽ được thực thi. Vì age
nhỏ hơn 18 lần này, kiểm tra điều kiện thất bại và mã trong khối else được thực thi:
Sorry, you are too young to vote.
Please register to vote as soon as you turn 18!
Mã này hoạt động vì nó chỉ có hai tình huống có thể đánh giá: một người hoặc đủ tuổi để bỏ phiếu hoặc không đủ tuổi để bỏ phiếu. Cấu trúc if-else hoạt động tốt trong các tình huống mà bạn muốn Python luôn thực thi một trong hai hành động có thể. Trong một chuỗi if-else đơn giản như thế này, một trong hai hành động sẽ luôn được thực thi.
Chuỗi if-elif-else
Thường thì bạn sẽ cần kiểm tra nhiều hơn hai tình huống có thể, và để đánh giá những tình huống này, bạn có thể sử dụng cú pháp if-elif-else của Python. Python chỉ thực thi một khối trong một chuỗi if-elif-else. Nó chạy từng kiểm tra điều kiện theo thứ tự, cho đến khi một kiểm tra thành công. Khi một kiểm tra thành công, mã theo sau kiểm tra đó được thực thi và Python bỏ qua phần còn lại của các kiểm tra.
Nhiều tình huống thực tế liên quan đến nhiều hơn hai điều kiện có thể. Ví dụ, hãy xem xét một công viên giải trí tính phí khác nhau cho các nhóm tuổi khác nhau:
- Miễn phí cho bất kỳ ai dưới 4 tuổi.
- Phí vào cửa cho bất kỳ ai từ 4 đến 18 tuổi là $25.
- Phí vào cửa cho bất kỳ ai từ 18 tuổi trở lên là $40.
Làm thế nào chúng ta có thể sử dụng một câu lệnh if để xác định giá vé vào cửa của một người? Mã sau kiểm tra nhóm tuổi của một người và sau đó in ra một thông báo về giá vé vào cửa:
age = 12
if age < 4:
print("Your admission cost is $0.")
elif age < 18:
print("Your admission cost is $25.")
else:
print("Your admission cost is $40.")
Kiểm tra if đầu tiên kiểm tra xem một người có dưới 4 tuổi hay không. Khi kiểm tra thành công, một thông báo phù hợp được in ra và Python bỏ qua phần còn lại của các kiểm tra. Dòng elif thực sự là một kiểm tra if khác, chỉ chạy nếu kiểm tra trước đó thất bại. Tại thời điểm này trong chuỗi, chúng ta biết người đó ít nhất là 4 tuổi vì kiểm tra đầu tiên đã thất bại. Nếu người đó dưới 18 tuổi, một thông báo phù hợp được in ra và Python bỏ qua khối else. Nếu cả hai kiểm tra if và elif đều thất bại, Python chạy mã trong khối else.
Trong ví dụ này, kiểm tra if đầu tiên đánh giá là False, vì vậy khối mã của nó không được thực thi. Tuy nhiên, kiểm tra elif đánh giá là True (12 nhỏ hơn 18) nên mã của nó được thực thi. Đầu ra là một câu, thông báo cho người dùng về giá vé vào cửa:
Your admission cost is $25.
Bất kỳ tuổi nào lớn hơn 17 sẽ khiến hai kiểm tra đầu tiên thất bại. Trong những tình huống này, khối else sẽ được thực thi và giá vé vào cửa sẽ là $40.
Thay vì in giá vé vào cửa trong khối if-elif-else, sẽ ngắn gọn hơn nếu chỉ đặt giá bên trong chuỗi if-elif-else và sau đó có một lệnh print()
duy nhất chạy sau khi chuỗi đã được đánh giá:
age = 12
if age < 4:
price = 0
elif age < 18:
price = 25
else:
price = 40
print(f"Your admission cost is ${price}.")
Các dòng thụt lề đặt giá trị của price
theo tuổi của người đó, như trong ví dụ trước. Sau khi giá được đặt bởi chuỗi if-elif-else, một lệnh print()
không thụt lề riêng biệt sử dụng giá trị này để hiển thị một thông báo báo cáo giá vé vào cửa của người đó.
Mã này tạo ra cùng một đầu ra như ví dụ trước, nhưng mục đích của chuỗi if-elif-else hẹp hơn. Thay vì xác định giá và hiển thị một thông báo, nó chỉ đơn giản xác định giá vé vào cửa. Ngoài việc hiệu quả hơn, mã sửa đổi này dễ thay đổi hơn so với cách tiếp cận ban đầu. Để thay đổi văn bản của thông báo đầu ra, bạn chỉ cần thay đổi một lệnh print()
thay vì ba lệnh print()
riêng biệt.
Sử dụng nhiều khối elif
Bạn có thể sử dụng bao nhiêu khối elif trong mã của mình tùy thích. Ví dụ, nếu công viên giải trí thực hiện một giảm giá cho người cao tuổi, bạn có thể thêm một kiểm tra điều kiện khác vào mã để xác định xem ai đó có đủ điều kiện nhận giảm giá cho người cao tuổi hay không. Giả sử rằng bất kỳ ai từ 65 tuổi trở lên trả một nửa giá vé thông thường, hoặc $20:
age = 12
if age < 4:
price = 0
elif age < 18:
price = 25
elif age < 65:
price = 40
else:
price = 20
print(f"Your admission cost is ${price}.")
Hầu hết mã này không thay đổi. Khối elif thứ hai bây giờ kiểm tra để đảm bảo một người dưới 65 tuổi trước khi gán cho họ mức giá vé đầy đủ là $40. Lưu ý rằng giá trị được gán trong khối else cần được thay đổi thành $20, vì các độ tuổi duy nhất đến khối này là những người từ 65 tuổi trở lên.
Bỏ qua khối else
Python không yêu cầu một khối else ở cuối một chuỗi if-elif. Đôi khi, một khối else hữu ích. Những lần khác, rõ ràng hơn khi sử dụng một câu lệnh elif bổ sung để bắt điều kiện cụ thể mà bạn quan tâm:
age = 12
if age < 4:
price = 0
elif age < 18:
price = 25
elif age < 65:
price = 40
elif age >= 65:
price = 20
print(f"Your admission cost is ${price}.")
Khối elif cuối cùng gán giá $20 khi người đó từ 65 tuổi trở lên, điều này rõ ràng hơn một chút so với khối else chung. Với thay đổi này, mọi khối mã phải vượt qua một kiểm tra cụ thể để được thực thi.
Khối else là một câu lệnh bắt tất cả. Nó khớp với bất kỳ điều kiện nào không được khớp bởi một kiểm tra if hoặc elif cụ thể, và điều đó đôi khi bao gồm dữ liệu không hợp lệ hoặc thậm chí độc hại. Nếu bạn có một điều kiện cuối cùng cụ thể mà bạn đang kiểm tra, hãy xem xét sử dụng một khối elif cuối cùng và bỏ qua khối else. Kết quả là, bạn sẽ tự tin hơn rằng mã của bạn sẽ chỉ chạy trong các điều kiện chính xác.
Kiểm tra nhiều điều kiện
Chuỗi if-elif-else rất mạnh mẽ, nhưng chỉ thích hợp để sử dụng khi bạn chỉ cần một kiểm tra thành công. Ngay khi Python tìm thấy một kiểm tra thành công, nó bỏ qua phần còn lại của các kiểm tra. Hành vi này có lợi, vì nó hiệu quả và cho phép bạn kiểm tra một điều kiện cụ thể.
Tuy nhiên, đôi khi điều quan trọng là kiểm tra tất cả các điều kiện quan tâm. Trong trường hợp này, bạn nên sử dụng một loạt các câu lệnh if đơn giản mà không có các khối elif hoặc else. Kỹ thuật này có ý nghĩa khi nhiều hơn một điều kiện có thể là True, và bạn muốn hành động trên mọi điều kiện là True.
Hãy xem xét lại ví dụ về tiệm pizza. Nếu ai đó yêu cầu một chiếc pizza hai lớp phủ, bạn sẽ cần đảm bảo bao gồm cả hai lớp phủ trên chiếc pizza của họ:
requested_toppings = ['mushrooms', 'extra cheese']
if 'mushrooms' in requested_toppings:
print("Adding mushrooms.")
if 'pepperoni' in requested_toppings:
print("Adding pepperoni.")
if 'extra cheese' in requested_toppings:
print("Adding extra cheese.")
print("\nFinished making your pizza!")
Chúng ta bắt đầu với một danh sách chứa các lớp phủ được yêu cầu. Câu lệnh if đầu tiên kiểm tra xem người đó có yêu cầu nấm trên chiếc pizza của họ hay không. Nếu có, một thông báo được in ra xác nhận lớp phủ đó. Kiểm tra cho pepperoni là một câu lệnh if đơn giản khác, không phải là một câu lệnh elif hoặc else, vì vậy kiểm tra này được chạy bất kể kiểm tra trước đó có thành công hay không. Câu lệnh if cuối cùng kiểm tra xem có yêu cầu thêm phô mai hay không, bất kể kết quả từ hai kiểm tra đầu tiên. Ba kiểm tra độc lập này được thực thi mỗi khi chương trình này được chạy.
Vì mọi điều kiện trong ví dụ này đều được đánh giá, cả nấm và phô mai thêm đều được thêm vào chiếc pizza:
Adding mushrooms.
Adding extra cheese.
Finished making your pizza!
Mã này sẽ không hoạt động đúng nếu chúng ta sử dụng một chuỗi if-elif-else, vì mã sẽ dừng chạy sau khi chỉ một kiểm tra thành công. Đây là những gì sẽ xảy ra:
requested_toppings = ['mushrooms', 'extra cheese']
if 'mushrooms' in requested_toppings:
print("Adding mushrooms.")
elif 'pepperoni' in requested_toppings:
print("Adding pepperoni.")
elif 'extra cheese' in requested_toppings:
print("Adding extra cheese.")
print("\nFinished making your pizza!")
Kiểm tra cho 'mushrooms' là kiểm tra đầu tiên thành công, vì vậy nấm được thêm vào chiếc pizza. Tuy nhiên, các giá trị 'extra cheese' và 'pepperoni' không bao giờ được kiểm tra, vì Python không chạy bất kỳ kiểm tra nào ngoài kiểm tra đầu tiên thành công trong một chuỗi if-elif-else. Lớp phủ đầu tiên của khách hàng sẽ được thêm vào, nhưng tất cả các lớp phủ khác của họ sẽ bị bỏ qua:
Adding mushrooms.
Finished making your pizza!
Tóm lại, nếu bạn chỉ muốn một khối mã chạy, hãy sử dụng một chuỗi if-elif-else. Nếu nhiều hơn một khối mã cần chạy, hãy sử dụng một loạt các câu lệnh if độc lập.
Comments