使用布尔逻辑:和/或和真/假

时间:2012-05-30 03:13:40

标签: python boolean

我正在用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语句。我怎么能改变它来打印那条线呢?

感谢您的帮助!

3 个答案:

答案 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 == catsdogs == cats中的任何一个或两者都评估为True,则if语句中的整个表达式将变为True。由于它们中的都不是True,因此if语句中的表达式失败,即False,并且不执行print语句。

最后,如果要打印要执行的语句,则必须确保将布尔表达式计算为True。一种方法是改变价值 dogs30,因为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上运行。

andor是二元运算,可以获取真值并计算新的真值。与1 + 3中的+一样,1是一个二元运算,它采用数字34并生成一个新数字a and ba获取两个真值bx + y并生成一个新值。就像我们可以x * yx生成与数字ya and b不同的数字一样,我们可以a or b或{{1} },它根据真值ab生成不同的真值。

if声明并不关心这一点。它不需要知道如何我们得到它正在测试的真值,它将以任何一种方式完全相同。 andor完全是分开的,它们只是结合真值以获得新值的方法。


andor工作原理的直觉是基于我们在谈论可能是真实的事情或英语时使用andor的一些方法。假的。

在声明“如果正在下雨然后我会得到一把伞”,“正在下雨”部分是一个可能是真或假的条件,以及句子的其余部分正在说如果这是真的将会发生什么。在英语中,我也可以说“如果下雨 我想走路那么我会得到一把雨伞”;这有两个单独的条件“正在下雨”和“我感觉像走路”通过单词组合成一个条件。这句话意味着如果“下雨”和“我觉得行走”都是真的,我会得到一把雨伞;如果天气晴朗的话,我认为我不需要雨伞,如果我开车的话,我不在乎在我家和车之间弄湿。

我也可以说“如果正在下雨 我想走路那么我会得到一把雨伞”。这句话意味着如果其中一个或两个条件都成立,我将得到一把保护伞。在这里我们可以猜到,如果下雨,我想在当天晚些时候有一把雨伞,即使我不喜欢走路,如果我想走路,我想要一把雨伞以防万一在我走路的时候下雨,即使现在不下雨。

在编程以及andor运算符中理解真值的最佳方法是牢记对英语andor的自然理解。这为您提供了一种直观的方式来快速理解涉及andor的简单表达式。但是在编程中,andor的工作方式已经形式化,因此我们可以写下完全它们的工作方式,无论正常英语使用中是否存在歧义或特殊情况。< / p> 如果A and B为True且A为True,则

B为True,否则为False(如果AB为False,则为False) 。如果A or BA为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语句和运算符andor)不是在精确的真值上运行,而是在“真理”值上运行。简单地说,数字为0,空容器和字符串,特殊值None当你将它们提供给期望真值的操作时就好像它们是False一样,而其他所有操作就好像它们一样{ {1}}。我们有时会使用“truthy”或“falsey”这两个词来描述不一定是TrueTrue的值,但它们的行为就像它们一样。

同样,从现有值中生成新真值的操作(如Falseand)不一定返回orTrue,它们可能会返回您给出的值它们是上表所要求的“真实”或“虚假”。

但是,如果有人在阅读这篇文章的早期阶段就是在学习使用真值进行编程,那么我强烈强烈建议您忽略这一点,并将自己视为操纵False和{ {1}},同样不要担心“短路评估”以及检查事物的顺序(如果只涉及真正的TrueFalse则无关紧要,或者甚至大多数时候你使用其他值)。一旦你掌握了基础知识,就可以很容易地理解这些概念。