在python中从float中减去boolean

时间:2013-09-03 21:05:02

标签: python

无论如何,在调试我的代码时,我发现声明基本上从boolean减去了float

然后我尝试在python控制台中跟随:

>>> 15.0 - True 
14.0
>>> 15.0 - False
15.0

任何人都可以向我解释:

3 个答案:

答案 0 :(得分:6)

这是合法的,因为boolint的子类:

>>> bool.__bases__
(<type 'int'>,)
>>> True == 1
True
>>> False == 0
True

是的,它有一些实际应用。例如,在引入三元语句之前可以做类似的事情:

result = [value_if_false, value_if_true][condition]

这基本上可以在此代码中完成:

if condition:
    result = value_if_false
else:
    result = value_if_true

其他实际用法是:

  • 你可以sum多张支票/布局来获得等于True的结果数量,
  • 您可以乘以检查结果:

    result = can_count_a * a + can_count_b * b
    

答案 1 :(得分:4)

  • http://docs.python.org/3/library/stdtypes.html#boolean-values

      

    布尔值是两个常量对象False和True。它们用于表示真值(尽管其他值也可以被视为虚假或真实)。

         

    在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别与整数0和1相似。

  • 现在不是,但你可以写

    result = numeric_value * a_bool (这个用法很多,例如,在着色器语言中使用)

    而不是

    result = numeric_value if a_bool else 0

    result = (value_if_false, value_if_true)[a_bool]

    不要做任何这些。

这主要是那些具有低级语言经验的人所期望的,为什么要远离他们呢?在C中,true和false仍然是1和0的宏。

在2.3之前,Python中也没有bool类型,所以当它被引入时,使它成为int的子类,确保没有代码被破坏。

答案 2 :(得分:2)

True计算结果为1,False计算结果为0.

>>> True is 1
False
>>> True == 1
True
>>>

Bool是int的子类。如PEP-285中所述:

  

6)bool应该从int继承吗?

     

=&GT;是。

     

在一个理想的世界中,bool可能会更好地作为一个独立的实现   知道如何执行混合模式算术的整数类型。   但是,从int继承bool可以极大地简化实现   (部分原因是所有调用PyInt_Check()的C代码都会继续   work - 对于int的子类返回true。另外,我相信   这在可替代性方面是正确的:需要int的代码   可以喂一个布尔,它的行为与0或1相同。代码   要求bool在给出int时可能不起作用;例如,3&amp;   4是0,但当被认为是真值时,3和4都是真的。

这没有任何实际用途,并且sudo使用bool的例子还有其他答案。我认为有一些真正的示例会很好:

f,b="Fizz","Buzz"
print "\n".join([["",f,b,f+b][(x%3==0) + 2*(x%5==0)] or str(x) for x in range(1,101)])

有问题的部分:

["",f,b,f+b][(x%3==0) + 2*(x%5==0)]

每行返回的选择基于两个布尔表达式,如果两者都为真,我们得到(True) + 2*(True),其值为4,这是一个fizzbuzz。一旦你习惯了True == 1False == 0

这个想法,就不难理解了

进一步保持主题:

print '\n'.join(['Fizz'*(not i%3) + 'Buzz'*(not i%5) or str(i) for i in range(1, 101)])

这个例子依赖于在python中乘以字符串时会发生什么:

>>> "Noelkd" * False
''

而非True评估为0:

>>> not True == 0
True

今年秋天的用途分为两类:

  • 更难以阅读代码。

  • 参加代码高尔夫比赛。