Mức độ ưu tiên và tính liên kết của các toán tử trong Python

Trong hướng dẫn này, bạn sẽ tìm hiểu mức độ ưu tiên và tính liên kết của các toán tử ảnh hưởng đến thứ tự của các hoạt động trong Python.

Mức độ ưu tiên của các toán tử Python

Sự kết hợp của các giá trị, biến, toán tử và lời gọi hàm được gọi là một biểu thức. Trình thông dịch Python có thể đánh giá một biểu thức hợp lệ.

Ví dụ:

 >>> 5 - 7 -2

Đây 5 - 7là một biểu thức. Có thể có nhiều hơn một toán tử trong một biểu thức.

Để đánh giá các loại biểu thức này, có một quy tắc ưu tiên trong Python. Nó hướng dẫn thứ tự thực hiện các thao tác này.

Ví dụ, phép nhân có mức độ ưu tiên cao hơn phép trừ.

 # Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2

Nhưng chúng ta có thể thay đổi thứ tự này bằng cách sử dụng dấu ngoặc đơn ()vì nó có mức độ ưu tiên cao hơn phép nhân.

 # Parentheses () has higher precedence >>> (10 - 4) * 2 12

Ưu tiên toán tử trong Python được liệt kê trong bảng sau. Nó theo thứ tự giảm dần (nhóm trên được ưu tiên cao hơn nhóm dưới).

Người điều hành Ý nghĩa
() Dấu ngoặc đơn
** Số mũ
+x, -x,~x Cộng một bậc, trừ một bậc, KHÔNG theo chiều bit
*, /, //,% Nhân, Phân chia, Phân chia tầng, Mô đun
+, - Phép cộng, phép trừ
<<, >> Toán tử dịch chuyển bit
& Bitwise VÀ
^ Bitwise XOR
| Bitwise HOẶC
==, !=, >, >=, <, <=, is, is not, in,not in So sánh, Danh tính, Toán tử thành viên
not Không logic
and Logic AND
or Logic HOẶC

Hãy xem một số ví dụ:

Giả sử chúng ta đang xây dựng một if… elsekhối chạy ifkhi bữa trưa là trái cây hoặc bánh mì sandwich và chỉ khi tiền nhiều hơn hoặc bằng 2.

 # Precedence of or & and meal = "fruit" money = 0 if meal == "fruit" or meal == "sandwich" and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")

Đầu ra

 Bữa trưa được giao

Chương trình này chạy ifkhối ngay cả khi tiền bằng 0. Nó không cung cấp cho chúng ta kết quả mong muốn vì mức độ ưu tiên andcao hơn or.

Chúng ta có thể nhận được kết quả mong muốn bằng cách sử dụng dấu ngoặc đơn ()theo cách sau:

 # Precedence of or & and meal = "fruit" money = 0 if (meal == "fruit" or meal == "sandwich") and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")

Đầu ra

 Không thể giao bữa trưa

Tính liên kết của các toán tử Python

Chúng ta có thể thấy trong bảng trên có nhiều toán tử tồn tại trong cùng một nhóm. Các toán tử này có cùng thứ tự ưu tiên.

Khi hai toán tử có cùng mức độ ưu tiên, tính liên kết giúp xác định thứ tự của các phép toán.

Tính liên kết là thứ tự mà một biểu thức được đánh giá có nhiều toán tử có cùng mức độ ưu tiên. Hầu như tất cả các toán tử đều có sự kết hợp từ trái sang phải.

Ví dụ, phép nhân và phép chia tầng có cùng mức độ ưu tiên. Do đó, nếu cả hai đều có trong một biểu thức thì biểu thức bên trái được đánh giá đầu tiên.

 # Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))

Đầu ra

 3 0

Lưu ý : Toán tử lũy thừa **có tính liên kết từ phải sang trái trong Python.

 # Shows the right-left associativity of ** # Output: 512, Since 2**(3**2) = 2**9 print(2 ** 3 ** 2) # If 2 needs to be exponated fisrt, need to use () # Output: 64 print((2 ** 3) ** 2)

Chúng ta có thể thấy rằng 2 ** 3 ** 2tương đương với 2 ** (3 ** 2).

Toán tử không liên kết

Một số toán tử như toán tử gán và toán tử so sánh không có tính liên kết trong Python. Có các quy tắc riêng cho các chuỗi của loại toán tử này và không thể được biểu thị dưới dạng tính kết hợp.

Ví dụ, x < y < zkhông có nghĩa là (x < y) < zcũng không x < (y < z). x < y < ztương đương với x < y and y < zvà được đánh giá từ trái sang phải.

Hơn nữa, trong khi chuỗi các nhiệm vụ như x = y = z = 1là hoàn toàn hợp lệ, x = y = z+= 2sẽ dẫn đến lỗi.

 # Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2

Đầu ra

 Tệp "", dòng 8 x = y = z + = 2 Cú pháp Lỗi: cú pháp không hợp lệ

thú vị bài viết...