Một biểu thức trong python bao gồm các biến, toán tử, giá trị, v.v. Khi trình thông dịch Python gặp bất kỳ biểu thức nào chứa một số phép toán, tất cả các toán tử sẽ được đánh giá theo một hệ thống phân cấp có thứ tự, được gọi là quyền ưu tiên của toán tử
Bảng ưu tiên toán tử Python
Dưới đây là bảng thứ tự ưu tiên toán tử trong python, tăng dần từ trên xuống và giảm dần từ dưới lên trên
OperatorDescription:=Assignment expressionlambdaLambda expressionif-elseConditional expressionorBoolean ORandBoolean ANDnot xBoolean NOT=,Comparison operators!=, ==Equality operatorsin, not in, is, is not,Identity operators, membership operators|Bitwise OR^Bitwise XOR&Bitwise ANDLeft and right Shifts+, –Addition and subtraction*, @, /, //, %Multiplication, matrix multiplication, division, floor division, remainder+x, -x, ~xUnary plus, Unary minus, bitwise NOT**Exponentiationawait xAwait expressionx[index], x[index], x(arguments…), x.attributeSubscription, slicing, call, attribute reference() Parentheses(Highest precedence)
Quy tắc ưu tiên toán tử Python - PEMDAS
Ưu tiên toán tử trong python tuân theo quy tắc PEMDAS cho các biểu thức số học. Thứ tự ưu tiên của các toán tử được liệt kê dưới đây theo thứ tự từ cao đến thấp
Đầu tiên, các dấu ngoặc đơn sẽ được đánh giá, sau đó là lũy thừa, v.v.
- P – Dấu ngoặc đơn
- E – Luỹ thừa
- M – Phép nhân
- D – Bộ phận
- A – Bổ sung
- S – Phép trừ
Trong trường hợp liên kết có nghĩa là, nếu hai toán tử có độ ưu tiên bằng nhau xuất hiện trong biểu thức, thì quy tắc kết hợp được tuân theo
Quy tắc kết hợp
Tất cả các toán tử, ngoại trừ lũy thừa (**) đều theo phép kết hợp từ trái sang phải. Nó có nghĩa là việc đánh giá sẽ tiến hành từ trái sang phải, trong khi đánh giá biểu thức
Ví dụ- (43+13−9/3∗7)(43 + 13 - 9/3 * 7)(43+13−9/3∗7)
Trong trường hợp này, mức độ ưu tiên của phép nhân và phép chia là bằng nhau, nhưng hơn nữa, chúng sẽ được đánh giá theo tính kết hợp từ trái sang phải
Hãy thử giải biểu thức này bằng cách tách nó ra và áp dụng quy tắc ưu tiên và kết hợp
- Thông dịch viên gặp dấu ngoặc đơn (. Do đó nó sẽ được đánh giá đầu tiên
- Sau này có bốn toán tử +++, −-−, ∗*∗ và ///
- Ưu tiên của (/,(/,(/, và ∗)>*) >∗)> Ưu tiên của (+,−)(+, -)(+,−)
- Chúng ta chỉ có thể sử dụng thứ tự ưu tiên của toán tử nếu tất cả các toán tử thuộc về các cấp độ khác nhau từ bảng phân cấp, đây không phải là trường hợp trong ví dụ của chúng ta
- Quy tắc kết hợp sẽ được tuân theo đối với các toán tử có cùng mức độ ưu tiên
- Biểu thức này sẽ được tính từ trái sang phải, 9/3∗79 / 3 * 79/3∗7 = 3∗73 * 73∗7 = 212121
- Bây giờ, biểu thức của chúng ta đã trở thành 43+13−2143+13-2143+13−21
- Từ trái sang phải Quy tắc kết hợp sẽ được tuân thủ lại. Vì vậy, giá trị cuối cùng của biểu thức sẽ là, 43+13−2143+13-2143+13−21 = 56−2156-2156−21 = 353535
ví dụ
Dưới đây là hai ví dụ để minh họa thứ tự ưu tiên của toán tử trong python. Xem phần giải thích để hiểu rõ về cách thức hoạt động của những thứ này trong nội bộ
Ví dụ: x = 7 + 3 * 2;
Tại đây, các toán tử có mức độ ưu tiên cao nhất sẽ xuất hiện ở đầu bảng, những toán tử có mức độ ưu tiên thấp nhất sẽ xuất hiện ở cuối bảng
Khi có nhiều hơn một toán tử xuất hiện trong một biểu thức, thứ tự đánh giá phụ thuộc vào quy tắc ưu tiên. Python tuân theo các quy tắc ưu tiên tương tự cho các toán tử toán học của nó mà toán học thực hiện
Dấu ngoặc đơn có mức độ ưu tiên cao nhất và có thể được sử dụng để buộc một biểu thức đánh giá theo thứ tự bạn muốn. Vì các biểu thức trong ngoặc đơn được đánh giá trước, nên 2 * (3-1) là 4 và (1+1)**(5-2) là 8. Bạn cũng có thể sử dụng dấu ngoặc đơn để làm cho một biểu thức dễ đọc hơn, chẳng hạn như trong (minute * 100) / 60. trong trường hợp này, dấu ngoặc đơn không thay đổi kết quả, nhưng chúng củng cố rằng biểu thức trong ngoặc đơn sẽ được đánh giá trước
Luỹ thừa có mức độ ưu tiên cao nhất tiếp theo, vì vậy 2**1+1 là 3 chứ không phải 4 và 3*1**3 là 3 chứ không phải 27. Bạn có thể giải thích lý do tại sao?
Cả hai toán tử nhân và chia đều có cùng mức độ ưu tiên, cao hơn phép cộng và phép trừ cũng có cùng mức độ ưu tiên. Vì vậy, 2*3-1 mang lại 5 thay vì 4 và 5-2*2 là 1, không phải 6
Các toán tử có cùng mức độ ưu tiên được đánh giá từ trái sang phải. Trong đại số chúng ta nói chúng là liên kết trái. Vì vậy, trong biểu thức 6-3+2, phép trừ xảy ra trước, cho kết quả là 3. Sau đó chúng tôi thêm 2 để có được kết quả 5. Nếu các hoạt động đã được đánh giá từ phải sang trái, kết quả sẽ là 6-(3+2), tức là 1
Ghi chú
Do một số vấn đề lịch sử, một ngoại lệ đối với quy tắc kết hợp từ trái sang phải là toán tử lũy thừa **. Một gợi ý hữu ích là luôn sử dụng dấu ngoặc đơn để buộc chính xác thứ tự bạn muốn khi có liên quan đến lũy thừa
Ghi chú
Đây là cách thứ hai mà dấu ngoặc đơn được sử dụng trong Python. Cách đầu tiên mà bạn đã thấy là () biểu thị một lệnh gọi hàm, với các đầu vào nằm trong dấu ngoặc đơn. Làm cách nào Python có thể biết khi nào dấu ngoặc đơn chỉ định gọi một hàm và khi nào chúng chỉ buộc thứ tự các phép toán cho các biểu thức toán tử không rõ ràng?
Câu trả lời là nếu có một biểu thức ở bên trái dấu ngoặc đánh giá một đối tượng hàm, thì dấu ngoặc đơn biểu thị lệnh gọi hàm, còn nếu không thì không. Bạn sẽ phải làm quen với việc đưa ra suy luận tương tự khi nhìn thấy dấu ngoặc đơn. đây có phải là một lệnh gọi hàm hay chỉ xác định mức độ ưu tiên?