4

无论如何,在调试我的代码时,我发现基本上booleanfloat.

然后我在 python 控制台中尝试了以下操作:

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

谁能给我解释一下:

4

3 回答 3

6

它是合法的,因为它bool是 的子类int

>>> 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
    
于 2013-09-03T21:08:15.030 回答
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成为确保没有代码被破坏的子类。

于 2013-09-03T21:07:54.433 回答
2

True 计算为 1,False 计算为 0。

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

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

6) bool 是否应该从 int 继承?

=> 是的。

在理想世界中,bool 可能更好地实现为知道如何执行混合模式算术的单独整数类型。但是,从 int 继承 bool 极大地简化了实现(部分原因是所有调用 PyInt_Check() 的 C 代码都将继续工作——这对于 int 的子类返回 true)。另外,我相信这在可替换性方面是正确的:需要 int 的代码可以输入 bool,它的行为与 0 或 1 相同。需要 bool 的代码在给定 int 时可能不起作用;例如,3 和 4 为 0,但 3 和 4 在被视为真值时都为​​真。

这没有太多实际用途,还有其他答案sudo以及使用布尔值的示例。我认为有一些真实的例子会很好:

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 == 1一旦你习惯了这个想法,就不难理解了False == 0

更符合主题:

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

此示例依赖于在 python 中乘以字符串时发生的情况:

>>> "Noelkd" * False
''

而 not True 的计算结果为 0:

>>> not True == 0
True

其用途分为两类:

  • 使代码更难阅读。

  • 参加代码高尔夫比赛。

于 2013-09-03T21:06:46.880 回答