我正在用Python学习基本的布尔逻辑。我理解了相等的运算符,但是当ands和ors被抛入时会感到困惑。例如,看看下面的代码:
people = 20
cats = 30
dogs = 15
if people < cats:
print "too many cats! the world is doomed!"
if people == cats or dogs == cats:
print "this is too hard"
我理解第一个if语句及其打印原因。我不知道如何评估第二个if语句。我怎么能改变它来打印那条线呢?
感谢您的帮助!
答案 0 :(得分:5)
and
要求表达式中 所有 部分的评估结果为True
,表达式为True
。
or
不那么挑剔,只要表达式的 任何 部分评估为True
整个表达式为True
}。
在此上下文中,您可能会遇到短路这个词。它只是意味着我们一旦确定结果就停止评估表达式。
因此,对于and
,我们可以在找到评估为False
的部分时立即停止查看表达式的其余部分,因为此时表达式永远无法计算为True
}。
同样,对于or
,只要我们找到True
的部分,我们就知道整个表达式将是True
,并且没有理由进一步查看。
对于您发布的代码示例:
if people == cats or dogs == cats:
print "this is too hard"
如果people == cats
,dogs == cats
中的任何一个或两者都评估为True
,则if
语句中的整个表达式将变为True
。由于它们中的都不是True
,因此if
语句中的表达式失败,即False
,并且不执行print语句。
最后,如果要打印要执行的语句,则必须确保将布尔表达式计算为True
。一种方法是改变价值
dogs
到30
,因为dogs == cats
将是True
,那就是True
足以使整个表达式{{1}}并使打印执行。
答案 1 :(得分:1)
OR测试两个或一个语句是否为真,并且测试两个语句是否为真。
答案 2 :(得分:1)
if
语句的评估方式相同。
if something:
do_stuff
如果something
为True,则运行do_stuff
块[1]。如果something
不为True,则不会运行do_stuff
块。你的两个if语句之间的区别并不是“与另一个语句不同”,而是它们在不同版本的something
上运行。
and
和or
是二元运算,可以获取真值并计算新的真值。与1 + 3
中的+
一样,1
是一个二元运算,它采用数字3
和4
并生成一个新数字a and b
。 a
获取两个真值b
和x + y
并生成一个新值。就像我们可以x * y
或x
生成与数字y
和a and b
不同的数字一样,我们可以a or b
或{{1} },它根据真值a
和b
生成不同的真值。
但if
声明并不关心这一点。它不需要知道如何我们得到它正在测试的真值,它将以任何一种方式完全相同。 and
和or
完全是分开的,它们只是结合真值以获得新值的方法。
and
和or
工作原理的直觉是基于我们在谈论可能是真实的事情或英语时使用and
和or
的一些方法。假的。
在声明“如果正在下雨然后我会得到一把伞”,“正在下雨”部分是一个可能是真或假的条件,以及句子的其余部分正在说如果这是真的将会发生什么。在英语中,我也可以说“如果下雨 我想走路那么我会得到一把雨伞”;这有两个单独的条件“正在下雨”和“我感觉像走路”通过单词和组合成一个条件。这句话意味着如果“下雨”和“我觉得行走”都是真的,我会得到一把雨伞;如果天气晴朗的话,我认为我不需要雨伞,如果我开车的话,我不在乎在我家和车之间弄湿。
我也可以说“如果正在下雨 或 我想走路那么我会得到一把雨伞”。这句话意味着如果其中一个或两个条件都成立,我将得到一把保护伞。在这里我们可以猜到,如果下雨,我想在当天晚些时候有一把雨伞,即使我不喜欢走路,如果我想走路,我想要一把雨伞以防万一在我走路的时候下雨,即使现在不下雨。
在编程以及and
和or
运算符中理解真值的最佳方法是牢记对英语and
和or
的自然理解。这为您提供了一种直观的方式来快速理解涉及and
和or
的简单表达式。但是在编程中,and
和or
的工作方式已经形式化,因此我们可以写下完全它们的工作方式,无论正常英语使用中是否存在歧义或特殊情况。< / p>
如果A and B
为True且A
为True,则
B
为True,否则为False(如果A
或B
为False,则为False) 。如果A or B
或A
为True,则B
为True(如果A
为False且B
为False则为False,否则为True)。这是一张表格:
A | B | A and B
------+-------+---------
True | True | True
True | False | False
False | True | False
False | False | False
A | B | A or B
------+-------+--------
True | True | True
True | False | True
False | True | True
False | False | False
[1]事实上,这个故事比这复杂得多(我的整个答案都是如此)。 Python中的大多数布尔操作(包括if
语句和运算符and
和or
)不是在精确的真值上运行,而是在“真理”值上运行。简单地说,数字为0,空容器和字符串,特殊值None
当你将它们提供给期望真值的操作时就好像它们是False
一样,而其他所有操作就好像它们一样{ {1}}。我们有时会使用“truthy”或“falsey”这两个词来描述不一定是True
或True
的值,但它们的行为就像它们一样。
同样,从现有值中生成新真值的操作(如False
和and
)不一定返回or
或True
,它们可能会返回您给出的值它们是上表所要求的“真实”或“虚假”。
但是,如果有人在阅读这篇文章的早期阶段就是在学习使用真值进行编程,那么我强烈强烈建议您忽略这一点,并将自己视为操纵False
和{ {1}},同样不要担心“短路评估”以及检查事物的顺序(如果只涉及真正的True
和False
则无关紧要,或者甚至大多数时候你使用其他值)。一旦你掌握了基础知识,就可以很容易地理解这些概念。