0

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

谢谢你的帮助!

4

3 回答 3

5

and要求表达式中的所有部分都计算为True,以使整个表达式为True

or不那么挑剔,只要表达式的任何部分计算为True整个表达式 is True

在这种情况下,您可能会遇到短路一词。它只是意味着我们一旦确定表达式的结果就停止计算表达式。

因此,对于 aand我们可以在找到计算结果为 的部分后立即停止查看表达式的其余部分,False因为此时表达式永远无法计算为True

同样,对于or,一旦我们找到 的部分True,我们就知道整个表达式将是True,并且没有理由进一步研究。

对于您发布的代码示例:

if people == cats or dogs == cats:
    print "this is too hard"

如果其中任何一个或两者都 people == cats评估dogs == catsTrue,则语句中的整个表达式if将变为True。由于它们都不True是 is ,因此语句中的表达式if失败,即 is False,并且不执行 print 语句。

最后,如果您想打印要执行的语句,您必须确保布尔表达式评估为True. 一种方法是更改​​为 to 的值, dogs因为30thendogs == catsTrue足以生成整个表达式True并执行打印。

于 2012-05-30T03:16:19.637 回答
1

OR 测试两个或一个陈述是否为真,AND 测试两个陈述是否为真。

于 2012-05-30T03:17:31.347 回答
1

if两个语句的评估方式相同。

if something:
    do_stuff

如果something为 True,则do_stuff块运行 [1]。如果something不是 True 则该do_stuff块不运行。您的两个 if 语句之间的区别不是一个“工作方式不同”,而是它们运行在不同版本的something.

and并且or是取真值并计算新真值的二元运算。就像在1 + 3中一样+是一个二元运算,它接受数字13产生一个新的数字4a and b取两个真值ab产生一个新值。尽管我们可以拥有x + yor x * y,它从数字xand中产生不同的数字y,但我们可以拥有a and bor ,它从真值anda or b中产生不同的真值。ab

但该if声明并不关心这一点。它不需要知道我们是如何得到它正在测试的真值的,它的工作方式完全相同。and并且or是完全独立的,它们只是组合真值以获得新值的方式。


and关于如何和工作的直觉or是基于我们在谈论可能对或错的事情时使用的一些方式and和英语。or

在“如果下雨了,那我就拿把伞”这句话中,“下雨了”部分是一个可能是真或假的条件,句子的其余部分是说如果它是真的会发生什么。用英语我也可以说“如果下雨了 我想走路,那我就拿把伞”;这将“正在下雨”和“我想走路”这两个单独的条件通过单词and组合成一个条件。这句话的意思是如果“正在下雨”和“我想走路”都是真的,我会得到一把雨伞;如果是晴天,那么我认为我不需要雨伞,如果我正在开车,那么我不在乎在我的房子和汽车之间被淋湿。

我也可以说“如果正在下雨 或者 我想走路,那么我会带把伞”。这句话的意思是,如果其中一个或两个条件都为真,我将得到一把雨伞。在这里我们可以猜测,如果下雨我想在当天晚些时候打伞,即使我不想走路,如果我想走路我想要一把伞,以防我走路的时候下雨,即使现在不下雨。

在编程和运算符中理解真值的最好方法andor保持对英语的这种自然理解,andor牢记在心。and这为您提供了一种快速理解涉及和的简单表达式的直观方式or。但是在编程的方式and和工作方式是形式化的,所以我们可以准确地or写下它们是如何工作的,而不管正常英语使用中的任何歧义或特殊情况。

A and B如果A为真且B为真,则为真,否则为假(如果其中一个为假A,则为B假)。A or B如果其中一个AB为真,则为真(如果A为假且B为假,则为假,否则为真)。这是一个显示这一点的表格:

  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语句和运算符andand or)不是对精确的真值进行操作,而是对“真实”值进行操作。简而言之,数字 0、空容器和字符串以及特殊值在您将它们提供给期望真值的操作时None就像False它们一样,而其他所有东西都像它们一样True。我们有时会使用术语“真实”或“虚假”来描述不一定TrueFalse表现得好像真实的价值观。

同样,从现有真值产生新真值的操作,例如andor不一定返回Trueor False,它们可能会返回您给它们的值,即上表要求的“真”或“假”。

但是,如果有人读到这篇文章是在学习用真值编程的早期阶段,我强烈建议你忽略这一点,只是认为自己在操纵Trueand False,同样不要担心“短路评估”和检查事物的顺序(如果只涉及真实TrueFalse涉及,甚至在大多数情况下使用其他值时都无关紧要)。一旦你掌握了基础知识,就很容易扩展你对这些概念的理解。

于 2012-05-30T04:10:28.173 回答