Mức độ ưu tiên của các câu lệnh logic NOT AND & OR trong python


81

Theo như tôi biết, trong C & C ++, thứ tự ưu tiên cho NOT AND & OR là NOT> AND> OR. Nhưng điều này dường như không hoạt động theo cách tương tự trong Python. Tôi đã thử tìm kiếm nó trong tài liệu Python và không thành công (Đoán là tôi hơi thiếu kiên nhẫn.). Ai đó có thể làm rõ điều này cho tôi không?


2
Bạn có thể đưa ra một ví dụ về việc ưu tiên toán tử không hoạt động như bạn nghĩ không?
dodgethesteamroller

không lớn hơn và lớn hơn hoặc
CtrlAltF2

Câu trả lời:


93

Nó KHÔNG, VÀ, HOẶC, từ cao nhất đến thấp nhất theo tài liệu về mức độ ưu tiên của Toán tử

Đây là bảng ưu tiên hoàn chỉnh, ưu tiên thấp nhất đến cao nhất. Một hàng có cùng mức độ ưu tiên và các chuỗi từ trái sang phải

 0. :=
 1. lambda
 2. ifelse
 3. or
 4. and
 5. not x
 6. in, not in, is, is not, <, <=, >, >=, !=, ==
 7. |
 8. ^
 9. &
 10. <<, >>
 11. +, -
 12. *, @, /, //, %
 13. +x, -x, ~x
 14. **
 14. await x
 15. x[index], x[index:index], x(arguments...), x.attribute
 16. (expressions...), [expressions...], {key: value...}, {expressions...}

1
Lưu ý rằng **có một số ngoại lệ được ghi chú trong chú thích cuối trang khi nó được ưu tiên hơn các toán tử số học.
Martijn Pieters

1
Điều này khiến nhà toán học bối rối trong tôi: trong số học, chúng ta sẽ nói rằng nó được ưu tiên hơn các toán tử số học. Ở bên phải của nó, **toán tử không được ưu tiên hơn các phép toán số học, nhưng nó có ở bên trái ... Ví dụ 5*2**2 == 5*(2**2),. Tuy nhiên nói như vậy là đúng 2**-1 == 2**(-1).
PhilMacKay

@PhilMacKay - có vẻ như, ví dụ: dấu trừ là một phần của intnghĩa đen, nhưng khi phân tích cú pháp với astnó thì không phải như vậy - nó UnaryOpUSub1dưới dạng toán hạng. Lý do thực sự là, không có cách nào khác để phân tích cú pháp. Tức 2**là toán hạng bên trái không đúng cho phép trừ nhị phân. Do đó "ngoại lệ ưu tiên lũy thừa", nhưng "chỉ ở bên phải".
Tomasz Gandor

32

Bạn có thể thực hiện kiểm tra sau để tìm ra mức độ ưu tiên của andor.

Trước tiên, hãy thử 0 and 0 or 1trong bảng điều khiển python

Nếu orràng buộc trước, thì chúng ta sẽ mong đợi 0là đầu ra.

Trong bảng điều khiển của tôi, 1là đầu ra. Nó có nghĩa andlà liên kết đầu tiên hoặc bằng or(có thể các biểu thức được đánh giá từ trái sang phải).

Sau đó, hãy thử 1 or 0 and 0.

Nếu orandràng buộc như nhau với thứ tự đánh giá từ trái sang phải được tích hợp sẵn, thì chúng ta sẽ nhận được 0dưới dạng đầu ra.

Trong bảng điều khiển của tôi, 1là đầu ra. Sau đó, chúng tôi có thể kết luận rằng andcó mức độ ưu tiên cao hơn or.


3
Một cách rõ ràng hơn, các từ ngữ được đánh giá là: ((0 and 0) or 1)(1 or (0 and 0))
Conchylicultor

1
Tuy nhiên, trong biểu thức thứ hai, (0 and 0)không bao giờ được đánh giá là (exp1 or exp2)trả về trực tiếp nếu exp1True. Tương tự như vậy trong biểu thức đầu tiên, and 0phần không bao giờ được đánh giá là exp1 and exp2trả về trực tiếp nếu exp1False.
Conchylicultor


4

Trong số các toán tử boolean, mức độ ưu tiên, từ yếu nhất đến mạnh nhất, như sau:

  1. or
  2. and
  3. not x
  4. is not; not in

Trường hợp các toán tử có mức độ ưu tiên ngang nhau, tiến hành đánh giá từ trái sang phải.


Xin lỗi # 2 của bạn là đúng về mặt kỹ thuật nhưng vẫn rất sai lầm. Trước hết, tài liệu dường như không thay đổi. Thứ hai, ý kiến ​​# 2 của bạn (gợi ý and& not xđược đánh giá từ trái sang phải) về mặt kỹ thuật tương đương với hiệu ứng chính thức, nhưng điều đó đơn giản là vì khi ở "cond1 chứ không phải cont2", python phải tính cont2 trước theo mặc định.
RayLuo

Cảm ơn @RayLuo, nhưng nó thậm chí còn không đúng về mặt kỹ thuật . Tôi đang đặt ý nghĩa vào các dòng được hiển thị không chính xác chia các hàng trong bảng đó. Nhìn vào tài liệu 2.7 ngày hôm nay or và có andvẻ là trong cùng một ô sử dụng Firefox nhưng không phải Opera . Sự khác biệt về mức độ ưu tiên giữa orandlà rõ ràng (ví dụ. 1 or 0 and 0Vs (1 or 0) and 0) giữa andnot xkhông quá nhiều vì lý do bạn đưa ra. Tôi sẽ sửa chữa câu trả lời của mình để phản ánh những gì tài liệu thực sự nói.
Oswald Wirt

2

Không có lý do chính đáng nào để Python có chuỗi ưu tiên khác của các toán tử đó hơn là được thiết lập tốt trong (hầu hết) tất cả các ngôn ngữ lập trình khác, bao gồm cả C / C ++.

Bạn có thể tìm thấy nó trong Tài liệu tham khảo ngôn ngữ Python , phần 6.16 - Ưu tiên toán tử, có thể tải xuống (cho phiên bản hiện tại và được đóng gói với tất cả các tài liệu tiêu chuẩn khác) từ https://docs.python.org/3/download.html hoặc đọc nó trực tuyến tại đây: 6.16. Ưu tiên của toán tử .

Nhưng vẫn có điều gì đó trong Python có thể khiến bạn hiểu nhầm: Kết quả của andvà các ortoán tử có thể khác với Truehoặc False- xem 6.11 Các phép toán Boolean trong cùng một tài liệu.


1

Một số ví dụ đơn giản; lưu ý sự ưu tiên của toán tử (không, và, hoặc); ngoặc đơn để hỗ trợ khả năng diễn giải của con người.

a = 'apple'
b = 'banana'
c = 'carrots'

if c == 'carrots' and a == 'apple' and b == 'BELGIUM':
    print('True')
else:
    print('False')
# False

Tương tự:

if b == 'banana'
True

if c == 'CANADA' and a == 'apple'
False

if c == 'CANADA' or a == 'apple'
True

if c == 'carrots' and a == 'apple' or b == 'BELGIUM'
True

# Note this one, which might surprise you:
if c == 'CANADA' and a == 'apple' or b == 'banana'
True

# ... it is the same as:
if (c == 'CANADA' and a == 'apple') or b == 'banana':
True

if c == 'CANADA' and (a == 'apple' or b == 'banana'):
False

if c == 'CANADA' and a == 'apple' or b == 'BELGIUM'
False

if c == 'CANADA' or a == 'apple' and b == 'banana'
True

if c == 'CANADA' or (a == 'apple' and b == 'banana')
True

if (c == 'carrots' and a == 'apple') or b == 'BELGIUM'
True

if c == 'carrots' and (a == 'apple' or b == 'BELGIUM')
True

if a == 'apple' and b == 'banana' or c == 'CANADA'
True

if (a == 'apple' and b == 'banana') or c == 'CANADA'
True

if a == 'apple' and (b == 'banana' or c == 'CANADA')
True

if a == 'apple' and (b == 'banana' and c == 'CANADA')
False

if a == 'apple' or (b == 'banana' and c == 'CANADA')
True
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.