2012-02-29 40 views
15

Giả sử tôi có một loạt biến số là True hoặc False. Tôi muốn đánh giá một bộ các biến trong một câu lệnh if để xem nếu họ là tất cả False như vậy:Đánh giá nhiều biến trong một câu lệnh 'if'?

if var1, var2, var3, var4 == False: 
    # do stuff 

Ngoại trừ việc không hoạt động. Tôi biết tôi có thể làm điều này:

if var1 == False and var2 == False and var3 == False and var4 == False: 
    # do stuff 

Nhưng điều đó khá xấu - đặc biệt nếu những câu lệnh này xảy ra nhiều trong mã của tôi. Có cách nào để tôi có thể thực hiện đánh giá này với cú pháp rõ ràng hơn (ví dụ như ví dụ đầu tiên) không?

Trả lời

33

Bạn nên never test a boolean variable with == True (or == False). Thay vào đó, một trong hai ghi:

if not (var1 or var2 or var3 or var4): 

hoặc sử dụng any (và trong các vấn đề liên quan anh em họ của nó all):

if not any((var1, var2, var3, var4)): 

hoặc sử dụng Python của transitive comparisons:

if var1 == var2 == var3 == var4 == False: 
+7

'không bất kỳ (...)' là cách Pythonic để làm điều đó cho trường hợp "tất cả sai", và 'tất cả (...)' là cho trường hợp "tất cả True". –

+0

Câu trả lời tốt, đầy đủ. –

+0

'bất kỳ ((var1, var2, var3, var4))' có nghĩa là tất cả sẽ được đánh giá bất kể nếu bạn đang sử dụng chức năng đắt tiền sẽ là khá kém hiệu quả và thay vì đánh bại mục đích của bất kỳ và ngắn mạch –

0

Bạn có thể sử dụng if var1 == var2 == var3 == False:

3

if all(not v for v in (var1, var2, var3, var4)):

Đó là cho "tất cả false" chi nhánh. Đối với "tất cả đúng", chỉ cần thực hiện if all((var2, var2, var3, var4)):.

+7

tất cả các thông tin sai có thể được rút ngắn thành: 'nếu không có bất kỳ ((var1, var2, var3, var4)):' – soulcheck

+0

@soulcheck Bạn cần đặt các đối số vào một lần lặp.'any' chỉ nhận một đối số. –

+0

@ Series8217 thx để hiệu chỉnh – soulcheck

3

Bạn có thể làm:

if var1 and var2 and var3 and var4: 
    do stuff 
7

Làm thế nào về điều này:

# if all are False 
if not any([var1, var2, var3, var4]): 
    # do stuff 

hoặc:

# if all are True 
if all([var1, var2, var3, var4]): 
    # do stuff 

Đây là những điều dễ đọc vì chúng được viết bằng tiếng Anh.

1

Còn chức năng tùy chỉnh thì sao?

function ListObjectsEqualTo(myList, toValue): 
    for i in myList: 
     if i != toValue: 
      return False 
    return True 

Bây giờ bạn có thể sử dụng nó

if ListObjectsEqualTo((var1, var2, var3, var4), False): 
    # do stuff 
1

Bạn có thể làm:

if var1 == var2 == var3 == var4 == False: 
    do_stuff() 

Nhưng, nếu các biến để đánh giá đúng hay sai, bạn cũng có thể làm điều này:

if var1 and var2 and var3 and var4: 
    do_stuff() 

Hoặc

if all([var1, var2, var3, var4]): 
    do_stuff() 
1
>>> not any([False, False]) 
True 
>>> not any([True, False]) 
False 
>>> 

Sử dụng từ khóa any().

Các vấn đề liên quan