2016-04-06 34 views
3

Yani bu yazmak istedim:if ifadesinde birden fazla veya koşul nasıl basitleştirilir?

if x % 2 == 0 or x % 3 == 0 or x % 5 == 0 or x % 7 == 0: 

Ama bu yol:

if x % (2 or 3 or 5 or 7) == 0: 

Nasıl bu düzgün bir şekilde yazmalıyım? Boolean işleci

+1

'Eğer varsa ([2, 3, 5, 7] 'de x% i için i):' - Şimdi kim dupe hedefi bulmama yardım edebilir ? –

+3

@KevinGuan Aslında: Eğer varsa (2,3,5,7) için x% i değil, ya da değilse (2,3,5,7) için x% i) . – Bakuriu

+1

@Bakuriu: Ah, doğru. Veya sadece eğer varsa ([2, 3, 5, 7] için x% i == 0): 'OP'nin kodu gibi. –

cevap

7

or. Sonuç True olduğunu ve eğer sol argümanı dönerse bu değerlendirir çünkü x % (1 or 2 or 3) yapamaz, böylece aksi takdirde doğru bir argüman döner sol argüman üzerinde bool çağırır ve görmek sadece x % 11 or 2 or 3 == 1 tarihi:

>>> True or False 
True 
>>> False or True 
True 
>>> False or False 
False 
>>> 1 or False # all numbers != 0 are "true" 
1 
>>> bool(1) 
True 
>>> 1 or 2 or 3 #(1 or 2) or 3 == 1 or 3 == 1 
1 

Birden çok koşulunuz olduğunda, bunları any veya all kullanarak azaltmaya çalışabilirsiniz.

Biz all([a,b,c,d]) hep True veya False dönmek olduğunu hariç a and b and c and deşdeğerdir iken any([a,b,c,d])a or b or c or d denk olduğunu var. Örneğin bu şekilde

:

if any(x%i == 0 for i in (2,3,5,7)): 

equivalently (0 beri sadece yanlış numara == 0not eşdeğerdir ise): Eşit

if any(not x%i for i in (2,3,5,7)): 

:

if not all(x%i for i in (2,3,5,7)) 

bulundurun aklınızda (de Morgan yasası:)): bir jeneratör ifade kullanarak böylece tüm koşullar değerlendirilir değildir any ve all kısa devre yapar

any(not p for p in some_list) == not all(p for p in some_list) 

not edin.any çağırmadan önce

>>> any([1/x for x in (1,0)]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <listcomp> 
ZeroDivisionError: division by zero 
>>> 1/0 or 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: division by zero 

1/0değerlendirilir Son örnekte:

>>> any(1/x for x in (1,0)) 
True 
>>> 1 or 1/0 
1 

Ve: arasındaki farkı görün.

İlgili konular