我正在阅读我书中的布尔值,并说:
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
我是否只需要盲目接受实际的定义,或者我能理解它们,因为它们确实有意义。
答案 0 :(得分:4)
“什么都不做”不是一种选择。数学表达式x or y
必须具有值(如果x
,y
或两者都为真,则为真。 x and y
必须有一个值(当且仅当x
和y
都为真时才为真。)
你的书定义它们的方式在数学上是正确的,但令人困惑(直到你进入短路评估之类的东西)。
答案 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():
如果obj
为None
,则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)在其布尔运算符and
和or
中实现short-circuiting。因此,他们从左到右评估他们的操作数,并在确定最终结果后立即停止。
由于x and y and z and ...
保证为假,如果任何操作数为假,它会在遇到假操作数时立即停止计算操作数。如果任何操作数为真,则x or y or z or ...
保证为真,因此只要它到达真实的操作数就会停止。在任何一种情况下,如果它们一直到最后一个操作数,它们就会返回它的值。
在某些语言中,布尔运算符只返回严格的布尔结果,true
或false
(在某些语言中,这些结果表示为1
和0
)。但是在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
这很容易理解,因为我们正在处理布尔值。记住这个例子,因为其他每个例子都可以这样想。
现在考虑and
和or
运算符是否在比较之前将每个对象转换为布尔值。例如,空字符串或空列表为False
,非空字符串为True
。它看起来像这样(显然这不是它实际上看起来像什么)
>>> "vanilla" and ""
False
>>> "" and "vanilla"
False
这很有道理。毕竟bool("vanilla") and bool("")
与True and False
相同,我们已经知道False
不是将它们实际转换为True
或False
,而是可以进行比较without ever converting them。因此,您真的不需要它来返回True
或False
。它只能返回它测试的实际对象。
>>> "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都不是真的。
(假或假==假)