需要帮助了解布尔人?

时间:2015-07-14 21:01:20

标签: python python-3.x boolean

我正在阅读我书中的布尔值,并说:

x和y ------------如果x为false,则返回x。否则,返回y。

x或y --------------如果x为真,则返回x。否则,返回y。

从日常使用“或”和“和”这对我来说没有意义 对我而言,如果它说:

x和y ------------如果x为false,则不执行任何操作。如果y为假,则什么也不做。如果x和y为真,则返回x和y

x或y --------------如果x为真,则返回x。如果x为假,请检查y。如果y为假,则什么也不做。如果y为真,则返回y

我是否只需要盲目接受实际的定义,或者我能理解它们,因为它们确实有意义。

8 个答案:

答案 0 :(得分:4)

“什么都不做”不是一种选择。数学表达式x or y 必须具有值(如果xy或两者都为真,则为真。 x and y必须有一个值(当且仅当xy都为真时才为真。)

你的书定义它们的方式在数学上是正确的,但令人困惑(直到你进入短路评估之类的东西)。

答案 1 :(得分:1)

与其他语言不同,您可以使用any object作为布尔运算的操作数。你所有的书都说你可以使用布尔运算符作为值的快速“过滤器”。

例如,假设您要在两个列表之间选择一个非空列表。以下是有效(以及更多Pythonic)方式:

display:block

对比(不使用Python中的Python习语):

>>> [] or ['something', 'here']
['something', 'here']

答案 2 :(得分:1)

你的书是对的 - 见documentation。一开始可能不直观,但这种行为(称为短路)非常有用。在一个简单的例子中,它允许您在检查某些条件时节省大量时间。在此示例中,函数f需要10秒进行评估,您肯定可以看到一个用途:

if f(foo) or f(bar) or f(baz):

如果f(foo)True,则无需评估f(bar)f(baz),因为整个if语句将为True。这些价值观是不必要的,你只是在浪费时间来计算它们。

此行为的另一个非常常见的用法是null(或用于python None)检查。它允许在一行内安全使用功能:

if obj != None and obj.foo():

如果objNone,则if语句保证为False,因此无需检查(甚至评估)obj.foo(),这是ACTION_IMAGE_CAPTURE好的,因为这会导致例外。

短路在许多编程语言中很常见,一旦你完全理解如何使用它就非常有用。

答案 3 :(得分:1)

虽然这本书以一种略微混乱的方式呈现,但它是正确的。布尔逻辑必须求值为true或false。

对于X和Y,为了返回true,它们都必须为true,如果X为false则返回false。如果X为真,则返回Y,其为真或假,也是正确的答案。

对于X或Y返回false,它们都必须为false。如果X为真,那么它可以返回true(X)。如果X为假,则返回Y的值。

答案 4 :(得分:1)

许多(大多数?)编程语言(包括Python)在其布尔运算符andor中实现short-circuiting。因此,他们从左到右评估他们的操作数,并在确定最终结果后立即停止。

由于x and y and z and ...保证为假,如果任何操作数为假,它会在遇到假操作数时立即停止计算操作数。如果任何操作数为真,则x or y or z or ...保证为真,因此只要它到达真实的操作数就会停止。在任何一种情况下,如果它们一直到最后一个操作数,它们就会返回它的值。

在某些语言中,布尔运算符只返回严格的布尔结果,truefalse(在某些语言中,这些结果表示为10)。但是在Python(以及其他一些例如Javascript和Common Lisp)中,它们返回已评估的最后一个操作数的值,这决定了最终结果。这通常比表达式的真值更有用。

当你将这些功能放在一起时,它允许一些简洁的习语,例如

quotient = b != 0 && a/b

而不是

if b != 0:
    quotient = false
else:
    quotient = a/b

答案 5 :(得分:1)

这种行为可能看起来很奇怪,但请考虑以下假设的例子。从明显的事情开始,

>>> True and False
False
>>> False and True
False

这很容易理解,因为我们正在处理布尔值。记住这个例子,因为其他每个例子都可以这样想。

现在考虑andor运算符是否在比较之前将每个对象转换为布尔值。例如,空字符串或空列表为False,非空字符串为True。它看起来像这样(显然这不是它实际上看起来像什么

>>> "vanilla" and ""
False
>>> "" and "vanilla"
False

这很有道理。毕竟bool("vanilla") and bool("")True and False相同,我们已经知道False

不是将它们实际转换为TrueFalse,而是可以进行比较without ever converting them。因此,您真的不需要它来返回TrueFalse。它只能返回它测试的实际对象。

>>> "vanilla" and ""
""
>>> "" and "vanilla"
""

出于真值测试的目的,返回""与返回False相同,因此无需将其转换为布尔值。这就是为什么它总是返回一个对象,其真值与运算符的结果相同。

答案 6 :(得分:0)

第一组描述是快捷方式:以下这些描述将给出与真实和假的“通常定义”完全相同的结果。

但是你自己的描述没有多大意义。你不能“无所事事”;你必须从比较中返回一些值,无论是真还是假。并且你不能同时返回a和b:同样,布尔比较的结果必须是布尔值,而不是一对布尔值。

答案 7 :(得分:0)

如果你在每个文字案例中考虑它可能会更容易

  

x和y ------------如果x为false,则返回x。否则,返回y。

     

x或y --------------如果x为真,则返回x。否则,返回y。

案例1:x = true,y = true

  

"如果x为假,则返回x。否则,返回y。"

然后这将返回y,这是真的。这是有道理的,因为x和y都是正确的。

(true and true == true)

  

"如果x为真,则返回x。否则,返回y。"

这将返回x,这是真的。这是有道理的,因为x或y中的一个是真的。

(true或true == true)

案例2:x = false,y = true

  

"如果x为假,则返回x。否则,返回y。"

然后这将返回x,这是假的。这是有道理的,因为x和y都不是真的。

(false and true == false)

  

"如果x为真,则返回x。否则,返回y。"   这将返回y。这是有道理的,因为x或y中的一个是真的。

(false或true == true)

案例3:x = true,y = false

  

"如果x为假,则返回x。否则,返回y。"

然后这将返回y,这是假的。这是有道理的,因为x和y都不是真的。

(true和false == false)

  

"如果x为真,则返回x。否则,返回y。"

然后这将返回x,这是真的。这是有道理的,因为x或y是真的

(true或false == true)

案例4:x = false,y = false

  

"如果x为假,则返回x。否则,返回y。"

然后这将返回x,这是假的。这是有道理的,因为x和y都不是真的。

(假和假==假)

  

"如果x为真,则返回x。否则,返回y。"

这将返回y,这是假的。这是有道理的,因为x和y都不是真的。

(假或假==假)