繁体   English   中英

Python-'如果没有'

[英]Python - 'if not'

以下代码

multiples = []
for i in range(1,1000):
    if i % 3 == 0 or i % 5 == 0:
        multiples.append(i)
addition = sum(multiples)
print addition

print(sum([i for i in range(1, 1000) if not (i%3 and i%5)]))

做同样的事。

现在,第二个代码中的if not部分如何计算?

我的意思是,在第一个代码中,必须专门说明i % 3 == 0 or i % 5 == 0 ,而在第二个代码中,无需== 0即可实现相同的目的。

使用德摩根定律

i % 3 == 0 or i % 5 == 0

是相同的:

not (i % 3 != 0 and i % 5 != 0)

在python中,将数字转换为布尔值时,任何非零值都将变为True

因此,而不是做i % 3 != 0if ,你可以使用i % 3因为如果它的0它会False ,如果它是非零这将是True

这是python的真值表: https : //docs.python.org/3.6/library/stdtypes.html#truth

PS sum()可以将生成器作为参数,因此您实际上可以这样做:

sum(i for i in range(1, 1000) if not (i%3 and i%5))

andor是布尔运算符,不是逻辑&| 所以写

a == 0 or b == 0

和写作一样

not a or not b

所以他们做同样的事情

作为结论,最好的办法是避免你的条件否定,不产生额外的列表理解,但用发电机的理解,而不是,我不会介意的测试对零,而不是使用not因为他们是整数毕竟。 我会这样做:

print(sum(i for i in range(1, 1000) if i%3==0 or i%5==0))

这是Python将整数转换为布尔值的方式的影响。 i % 3的结果取决于i的值是0、1或2。 在Python 3.x中(并且默认情况下在Python 2.x中也是如此,除非您已对其进行了重新分配),所有非零整数的值均为False ,零值的值为True

因此if not (i % 3)将评价(i % 3)为一个整数0,1或2,然后not将这些转换为FalseTrueTrue

在Python中,通常将0解释为false。 因此,在第一个代码块中, i % 3 == 0有效地等于not i % 3 命令行示例:

>>> 6 % 3 == 0
True
>>> not 6 % 3
True
>>> 7 % 3 == 0
False
>>> not 7 % 3
False

0 === false这个快捷方式在许多语言中都会出现,如果您不习惯它,可能会感到困惑。

在Python中,每个对象都有一个布尔值。

在整数的情况下,除0以外,它们中的任何一个都是True

因此,当您将数字i可以除以3 ,表达式i % 3将为0 但是我们知道0False not运算符将否定该表达式,因此not False将变为True

同样, not i % 5也适用。

希望能帮助到你。

可以测试任何对象的真值,以在if或while条件中使用,或用作以下布尔运算的操作数。 以下值为“假”:

  • 没有

  • 任何数字类型的零,例如0、0L,0.0、0j。

  • 任何空序列,例如'',(),[]。

  • 任何空映射,例如{}。

  • 用户定义的类的实例,如果该类定义了一个非零 ()或len ()方法,则该方法返回整数零或布尔值False。 [1]

所有其他值都被认为是真实的-因此许多类型的对象总是真实的。

另请参阅: https : //docs.python.org/2/library/stdtypes.html

请参见,i%3 == 0如果条件满足,则返回true。 现在,在python中假设:

 i = 6
 6 % 3 = 0 and 0==0 is true

因此,结果将是正确的。 在第二种情况下

6 % 3 = 0. 

现在,布尔值0表示错误。 因此,使用not表示不为假,即为true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM