Viết câu lệnh if trong một dòng bằng toán tử bậc ba của Python (toán tử điều kiện)

Kinh doanh

Python có một phong cách viết được gọi là toán tử bậc ba (toán tử có điều kiện) có thể mô tả một quá trình giống như một câu lệnh if trong một dòng duy nhất.

Phần sau được giải thích ở đây, cùng với mã mẫu.

  • Cách viết cơ bản của toán tử bậc ba
  • if ... elif ... else ...Mô tả điều này trong một dòng
  • Kết hợp Danh sách Ký hiệu Toàn diện và Toán tử bậc ba
  • Sự kết hợp của các hàm ẩn danh (biểu thức lambda) và các toán tử bậc ba

Xem bài viết sau để biết thêm thông tin về câu lệnh if thông thường.

Cách viết cơ bản của toán tử bậc ba

Trong Python, toán tử bậc ba có thể được viết như sau

Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false

Nếu bạn muốn chuyển đổi các giá trị theo điều kiện, chỉ cần viết từng giá trị như nó vốn có.

Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

Nếu bạn muốn chuyển đổi xử lý theo điều kiện, hãy mô tả từng biểu thức.

a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

Các biểu thức không trả về giá trị (biểu thức trả về Không có) cũng được chấp nhận. Tùy thuộc vào điều kiện, một trong các biểu thức được đánh giá và quá trình được thực hiện.

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

Tương đương với đoạn mã sau được viết bằng câu lệnh if thông thường.

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

Nhiều biểu thức điều kiện cũng có thể được nối bằng cách sử dụng các toán tử logic (và, hoặc, v.v.).

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...Mô tả một dòng

if ... elif ... else ...Không có cách đặc biệt nào để viết điều này trên một dòng. Tuy nhiên, nó có thể được thực hiện bằng cách sử dụng một toán tử bậc ba khác trong biểu thức được đánh giá khi biểu thức điều kiện của toán tử bậc ba là sai. Hình ảnh của toán tử bậc ba lồng nhau.

Tuy nhiên, tốt nhất là không nên sử dụng rộng rãi vì nó làm giảm khả năng đọc.

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

Biểu thức điều kiện sau có thể được hiểu theo hai cách sau, nhưng được coi là biểu thức điều kiện trước (1).

A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C 

Một ví dụ cụ thể như sau. Biểu thức đầu tiên được coi như thể nó là biểu thức thứ hai.

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

Kết hợp Danh sách Ký hiệu Toàn diện và Toán tử bậc ba

Một cách sử dụng hữu ích của toán tử bậc ba là khi xử lý danh sách trong ký hiệu hiểu danh sách.

Bằng cách kết hợp toán tử bậc ba và ký hiệu hiểu danh sách, có thể thay thế các phần tử của danh sách hoặc thực hiện một số xử lý khác tùy thuộc vào điều kiện.

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

Để biết thêm thông tin về ký hiệu hiểu danh sách, hãy xem bài viết sau.

Sự kết hợp của các hàm ẩn danh (biểu thức lambda) và các toán tử bậc ba

Toán tử bậc ba, có thể được mô tả ngắn gọn ngay cả trong một hàm ẩn danh (biểu thức lambda), rất hữu ích.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Lưu ý rằng, mặc dù không liên quan đến toán tử bậc ba, nhưng ví dụ trên sẽ gán tên cho biểu thức lambda. Do đó, các công cụ kiểm tra tự động như quy ước mã hóa PEP8 của Python có thể tạo ra Cảnh báo.

Điều này là do PEP8 khuyến nghị sử dụng def khi gán tên cho các hàm.

Khái niệm về PEP8 như sau

  • Ví dụ: các biểu thức Lambda được sử dụng để chuyển các đối tượng có thể gọi làm đối số mà không cần đặt tên cho chúng
  • Trong biểu thức lambda, sử dụng def để xác định theo tên
Copied title and URL