如何简化if语句中的多个或条件?

时间:2016-04-06 11:32:24

标签: python python-3.x if-statement

所以我想写这个:

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

但是这样:

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

我应该如何正确地写出来?

1 个答案:

答案 0 :(得分:7)

or是一个布尔运算符。它在左参数上调用bool并查看结果是否为True,如果是,则返回左参数,否则返回正确的参数,因此您不能执行x % (1 or 2 or 3)因为这从x % 1开始评估为1 or 2 or 3 == 1

>>> 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

只要您有多个条件,就可以尝试使用anyall来减少它们。

我们认为any([a,b,c,d])相当于a or b or c or dall([a,b,c,d])相当于a and b and c and d ,除了他们总是返回TrueFalse

例如:

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

等效(因为0,如果唯一的错误数字== 0等同于not):

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

等效地:

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

请记住(de Morgan law:not a or not b == not (a and b)):

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

请注意,使用生成器表达式会使anyall短路,因此不会评估所有条件。看看之间的区别:

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

>>> 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}}在调用1/0之前评估