[英]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 != 0
中if
,你可以使用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))
and
和or
是布尔运算符,不是逻辑&
和|
。 所以写
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
将这些转换为False
, True
, True
。
在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
。 但是我们知道0
是False
。 not
运算符将否定该表达式,因此not False
将变为True
。
同样, not i % 5
也适用。
希望能帮助到你。
可以测试任何对象的真值,以在if或while条件中使用,或用作以下布尔运算的操作数。 以下值为“假”:
没有
假
任何数字类型的零,例如0、0L,0.0、0j。
任何空序列,例如'',(),[]。
任何空映射,例如{}。
用户定义的类的实例,如果该类定义了一个非零 ()或len ()方法,则该方法返回整数零或布尔值False。 [1]
所有其他值都被认为是真实的-因此许多类型的对象总是真实的。
请参见,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.