Trong Python, các toán tử được thực hiện theo một thứ tự nhất định, tương tự như quy tắc thực hiện phép tính trong toán học. Để hiểu rõ hơn về thứ tự ưu tiên toán tử trong Python và cách nó ảnh hưởng đến kết quả của biểu thức, hãy cùng tìm hiểu chi tiết trong bài viết này.
Các điểm chính
Khi đọc xong bài viết, bạn sẽ:
- Hiểu rõ bản chất của thứ tự ưu tiên toán tử: Nắm vững định nghĩa và tầm quan trọng của việc xác định thứ tự thực hiện các phép toán.
- Làm chủ bảng thứ tự ưu tiên toán tử Python: Biết cách tra cứu và áp dụng bảng này để đảm bảo tính chính xác của code.
- Vận dụng linh hoạt thông qua các ví dụ minh họa: Thực hành các ví dụ cụ thể giúp bạn hiểu sâu hơn cách toán tử được xử lý theo thứ tự ưu tiên.
- Nâng cao kỹ năng giải quyết các bài toán phức tạp: Phát triển khả năng tư duy logic và giải quyết các bài toán liên quan đến nhiều toán tử.
Thứ tự ưu tiên toán tử trong Python
Khi một biểu thức có nhiều toán tử, thứ tự ưu tiên toán tử (Operator Precedence) sẽ quyết định trình tự thực hiện các phép toán. Nếu một biểu thức bao gồm nhiều toán tử, thứ tự thực hiện các toán tử sẽ tuân theo quy tắc ưu tiên. Ví dụ, hãy xem xét biểu thức sau:
a = 2 + 3 * 5
Giá trị của a là bao nhiêu? Sẽ là 17 (nhân 3 với 5 trước rồi cộng với 2) hay 25 (cộng 2 và 3 trước, sau đó nhân với 5)? Đây chính là lúc quy tắc ưu tiên toán tử trong Python được áp dụng.

Nếu chúng ta chỉ xét các toán tử số học trong Python, trình thông dịch Python cũng áp dụng quy tắc BODMAS quen thuộc (hay PEMDAS ở một số nước). Tức là các phép toán trong ngoặc được ưu tiên trước, tiếp theo là phép chia và phép nhân, rồi đến phép cộng và phép trừ. Vì vậy, giá trị của a trong biểu thức trên sẽ là 17.
Để dễ hình dung hơn, bạn cứ xem phép tính như là một bài toán ở trường. Bình thường, các thầy cô luôn dặn, bài toán mà có nhiều phép tính thì phải “nhân chia trước, cộng trừ sau” đúng không? Với Python, ngôn ngữ lập trình này cũng sẽ làm đúng y như vậy!
Bên cạnh thứ tự ưu tiên, tính kết hợp (associativity) của các toán tử cũng quan trọng. Nếu một biểu thức có nhiều toán tử có cùng mức ưu tiên, tính kết hợp sẽ xác định trình tự thực hiện. Hầu hết các toán tử có tính kết hợp từ trái sang phải. Điều này có nghĩa là toán tử ở bên trái sẽ được thực hiện trước toán tử ở bên phải.
Hãy xem xét một biểu thức khác:
b = 10 / 5 * 4
Trong trường hợp này, cả hai toán tử * (nhân) và / (chia) đều có cùng mức ưu tiên. Tuy nhiên, nhờ tính kết hợp từ trái sang phải, phép chia 10 / 5 sẽ được thực hiện trước, cho ra kết quả là 2. Sau đó, kết quả này sẽ được nhân với 4 (2 * 4), giá trị cuối cùng của b sẽ là 8.
Bảng thứ tự ưu tiên toán tử trong Python
Bảng dưới đây liệt kê các toán tử trong Python theo thứ tự ưu tiên giảm dần.
Stt | Toán tử & mô tả |
1 | () ,[] , {} Dấu ngoặc tròn, ngoặc vuông và ngoặc nhọn |
2 | [index] , [index:index] Truy cập phần tử (subscription), cắt (slicing) |
3 | await x Biểu thức await |
4 | ** Lũy thừa |
5 | +x , -x , ~x Dương (Positive), âm (negative), đảo bit (bitwise NOT) |
6 | * , @ , / , // , % Nhân, nhân ma trận, chia, chia lấy phần nguyên, chia lấy dư |
7 | + , - Cộng và trừ |
8 | << , >> Dịch trái, dịch phải (bit) |
9 | & AND (bit) |
10 | ^ XOR (bit) |
11 | | OR (bit) |
12 | in , not in , is , is not , < , <= , > , >= , != , == So sánh, bao gồm kiểm tra phần tử (membership) và kiểm tra đồng nhất (identity) |
13 | not x NOT (logic) |
14 | and AND (logic) |
15 | or OR (logic) |
16 | if – else Biểu thức điều kiện |
17 | lambda Biểu thức Lambda |
18 | := Toán tử Walrus |
Ví dụ về thứ tự ưu tiên toán tử trong Python
Khi làm việc với nhiều toán tử trong cùng một biểu thức, Python cần một quy tắc để biết nên thực hiện toán tử nào trước. Quy tắc này được gọi là “thứ tự ưu tiên của toán tử”. Hãy cùng xem xét ví dụ sau để hiểu rõ hơn về quy tắc này:
a = 20
b = 10
c = 15
d = 5
e = 0
e = (a + b) * c / d # (30 * 15) / 5
print ("Giá trị của (a + b) * c / d là ", e)
e = ((a + b) * c) / d # (30 * 15) / 5
print ("Giá trị của ((a + b) * c) / d là ", e)
e = (a + b) * (c / d) # (30) * (15/5)
print ("Giá trị của (a + b) * (c / d) là ", e)
e = a + (b * c) / d # 20 + (150/5)
print ("Giá trị của a + (b * c) / d là ", e)
Kết quả khi chạy chương trình:
Giá trị của (a + b) * c / d là 90.0
Giá trị của ((a + b) * c) / d là 90.0
Giá trị của (a + b) * (c / d) là 90.0
Giá trị của a + (b * c) / d là 50.0
Ví dụ trên cho thấy:
- Phép toán trong ngoặc
()
luôn được ưu tiên thực hiện trước. - Trong trường hợp không có ngoặc, phép nhân (
*
) và phép chia (/
) có độ ưu tiên cao hơn phép cộng (+
) và phép trừ (-
).
Lời kết
Vậy là chúng ta vừa cùng nhau tìm hiểu chi tiết về thứ tự ưu tiên của các toán tử trong Python. Hi vọng qua bài viết này, bạn đã nắm vững được quy tắc này và có thể áp dụng nó một cách hiệu quả trong quá trình lập trình. Việc hiểu rõ thứ tự ưu tiên toán tử sẽ giúp bạn viết code chính xác hơn, tránh những lỗi không đáng có và tối ưu hóa hiệu suất chương trình.
Mọi người cũng đọc