2012-05-06 68 views
7

Tôi đang nhầm lẫn về cách Python đánh giá các câu lệnh boolean.Thao tác Boolean

Ví dụ:

False and 2 or 3 

lợi nhuận 3

Làm thế nào là đánh giá? Tôi nghĩ Python lần đầu tiên nhìn vào 'False và 2', và trả về False mà không cần nhìn vào 'hoặc 3'. Thứ tự của Python nhìn thấy ở đây là gì?

khác là:

1 or False and 2 or 2 and 0 or 0 

lợi nhuận 1

Từ những gì tôi thu thập được từ ví dụ đầu tiên, tôi nghĩ Python sẽ đánh giá từ trái sang phải, vì vậy '1 hoặc False' sẽ trở lại 1, sau đó '1 và 2' sẽ trả về 2, sau đó '2 hoặc 2' sẽ trả về 2 đầu tiên, sau đó '2 và 0' sẽ trả về 0, sau đó '0 hoặc 0' sẽ trả lại giá trị thứ hai 0.

Như bạn có thể nói rằng tôi khá lúng túng ở đây, xin hãy giúp đỡ!

Cảm ơn!

Trả lời

9

and có mức độ ưu tiên cao hơn or.

False and 2 or 3 

được đánh giá là

((False and 2) or 3) 

Kể từ khi phần đầu tiên (False and 2)False, Python có để đánh giá phần thứ hai để xem toàn bộ điều kiện vẫn có thể trở thành True hay không. Có thể, kể từ khi 3 đánh giá là True để toán hạng này được trả về.

tương tự cho 1 or False and 2 or 2 and 0 or 0 mà được đánh giá là

(1 or ((False and 2) or ((2 and 0) or 0))) 

Kể từ 1 đánh giá để True, toàn bộ điều kiện sẽ được True, cho dù đánh giá cao các toán hạng khác có.Python có thể ngừng đánh giá tại thời điểm này và một lần nữa, trả về toán hạng xác định giá trị cuối cùng.

Dừng càng sớm càng kết quả cuối cùng được xác định được gọi là short-circuit evaluation và có thể được mô tả như sau:

Bất cứ khi nào kết quả cuối cùng của biểu thức được xác định, thủ tục thẩm định dừng lại và bằng Python giá trị của toán hạng đó xác định giá trị cuối cùng được trả về. Đó là, giả sử một đánh giá trái sang phải:

  • cho các nhà điều hành and, trái nhất toán hạng mà đánh giá để False (hoặc người cuối cùng)
  • cho các nhà điều hành or, trái nhất toán hạng mà đánh giá để True (hoặc người cuối cùng)
+0

Ah để so sánh với và phải được đặt trong dấu ngoặc đơn của riêng chúng. Điều đó có ý nghĩa hơn rất nhiều. Làm thế nào bạn biết làm (1 hoặc (((Sai và 2) hoặc (2 và 0)) hoặc 0)) thay vì (1 hoặc (Sai ​​và 2) hoặc (2 và 0) hoặc 0)? – kkSlider

+1

@kkSlider Chỉ khi bạn cần thay đổi thứ tự ưu tiên, hoặc muốn làm cho nó rõ ràng hơn - giống như trong toán học thông thường. Quá trình đánh dấu quá mức sẽ làm cho mã của bạn ít rõ ràng hơn. Như ví dụ của bạn. đó là vấn đề logic của tình huống của bạn. –

+0

@kkSlider: Nó không phải là nếu bạn không muốn thực thi một thứ tự nhất định. Nhưng nó phải nếu bạn muốn đánh giá biểu thức là 'False và (2 hoặc 3)'. * chỉnh sửa: * những gì @Lattyware nói :) –

3

Vấn đề ở đây là có thứ tự để đánh giá và and has a higher precedence than or. Như vậy, chúng được đánh giá từ trái sang phải ở đây.

Với điều này, False and 2 or 3 là, để trăn, (False and 2) or 3 - vì vậy, nó sẽ đánh giá thành False or True, sau đó đến True.

Trong ví dụ tiếp theo của bạn, Python ngắn mạch, vì vậy 1 or False đánh giá để True như 1 làm, và do đó trả về 1. Phần còn lại không bao giờ được đánh giá. Điều này có ý nghĩa như thể một phần của orTrue, bạn biết toàn bộ điều phải là - vậy tại sao lại phải làm thêm công việc?

Một cách tốt để kiểm tra này là để xác định chức năng in:

>>> def test(x): 
...  print("Test: "+str(x)) 
...  return x 
... 
>>> test(1) or test(0) or test(3) 
Test: 1 
1 
>>> test(0) or test(0) or test(3) 
Test: 0 
Test: 0 
Test: 3 
3 
>>> test(False) and test(2) or test(3) 
Test: False 
Test: 3 
3 
>>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0) 
Test: 1 
1 

này làm cho nó dễ dàng để xem những gì được đánh giá, và theo thứ tự nào.

2

Tôi đọc về điều này một thời gian trở lại trên trang tài liệu python. Nếu tôi tìm thấy nó, tôi sẽ đăng tài liệu tham khảo. Nó đã nói điều gì đó dọc theo dòng, trong một câu lệnh boolean, Python sẽ trả về đối tượng True đầu tiên. Do đó .... và đã được giả mạo với Sai, nhưng chỉ có một đối số, là 3 (Đúng).

+0

Tôi có một số gõ xấu ở đây, nhưng có, như những người khác đã đề cập, bước đầu tiên là thứ tự ưu tiên boolean, và tiếp theo là Python sẽ không chỉ trả về True hoặc Sai cho tuyên bố, nhưng giá trị thực tế (có thể có True hoặc False). – jheld

2

Nó được đánh giá như thế:

result = (False and 2) or 3 

Vì vậy, về cơ bản nếu False and 2 là đúng-ish, sau đó nó sẽ được trả về, nếu không 3 được trả về.