在python中使用和逻辑运算符的正确方法是什么?

时间:2016-09-04 03:08:35

标签: python logical-operators brute-force

在我改进代码之前,我正试图强行执行一个项目问题。我不能让多个条件和逻辑运算符在我的循环中工作。这是代码,编辑器显示没有错误,但它只是不增加条件值,所以显然有些条件是错误的。有人能告诉我使用多个逻辑运算符的正确方法吗?

i = 20

while (i % 2 != 0 and i % 3 != 0 and i % 4 != 0 and i % 5 != 0 and
     i % 6 != 0 and i % 7 != 0 and i % 8 != 0 and i % 9 != 0 and
     i % 10 != 0 and i % 11 != 0 and i % 12 != 0 and i % 13 != 0 and
     i % 14 != 0 and i % 15 != 0 and i % 16 != 0 and i % 17 != 0 and
     i % 18 != 0 and i % 19 != 0 and i % 20 != 0):
    i = i + 20
else:
    print(i)

1 个答案:

答案 0 :(得分:1)

看起来你正试图找到最小的数字,它是从1到20(包括1和20)的所有整数的倍数。你从20开始,你想继续上升20,直到你的状况得到满足。

在较小的情况下更容易看到问题。假设我们只关心2,3和4。

我们希望找到一个的数字

i % 2 == 0 and i % 3 == 0 and i % 4 == 0

但是对此的否定是

not (i % 2 == 0 and i % 3 == 0 and i % 4 == 0)

或分发not

i % 2 != 0 or i % 3 != 0 or i % 4 != 0

换句话说,如果任何的数字未能均匀划分,您希望增加20,而不是所有的数字都不能。

例如,

20可被2整除,因此i % 2 != 0为False,因此您有False and i % 3 != 0 and.. etc,这仍然是假的。代码的工作版本看起来像

i = 20
while any(i % num != 0 for num in range(2,21)):
    i += 20

我使用了生成器表达式以避免所有重复。注意认为这比使用他们想要你使用的数学技巧慢 ,因为最终答案有9位数。