【问题标题】:and / or operators return value [duplicate]和/或运算符返回值[重复]
【发布时间】:2011-05-27 13:04:03
【问题描述】:

我正在观看2007 video on Advanced Python or Understanding Python,在 18'27" 时,演讲者声称“在 Python 中,andor 返回两个值之一,而 not 总是返回一个布尔值。 " 什么时候是这样的?

据我所知,andor 也返回布尔值。

【问题讨论】:

  • 可能会让您感到困惑的是,您可以在似乎需要布尔值的上下文中使用任何数据类型。 'if 17: blah' 是合法的。

标签: python operators logical-operators


【解决方案1】:

andor 运算符确实返回它们的一个操作数,而不是像 TrueFalse 这样的纯布尔值:

>>> 0 or 42
42
>>> 0 and 42
0

not 总是返回一个纯布尔值:

>>> not 0
True
>>> not 42
False

【讨论】:

  • 你知道返回的操作数的顺序是什么吗?从头到尾?
  • 决定结果(即真或假)的第一个值(从左到右)是结果。
【解决方案2】:

请参阅 Python 文档中标准库参考中的 this 表:

【讨论】:

  • “是假的”部分有点令人困惑。它更像等于 False 或在 if 中评估为 False
  • @Adam 不,这绝对不像“等于 False”。例如,0[] 都是 false,但只有第一个等于 False。实际的规则在上一节中有详细解释,但是保持头脑清醒仍然有点混乱。这就是为什么在现实生活中,每个人(包括核心开发人员)都说“真实”和“虚假”,但参考文档避免了这种情况。
  • 至于“是假”是如何被解释器实际评估的,我相信 2.7 在任何地方都没有完全定义它,尽管你可以从 __nonzero__ 文档中很好地猜到它的意思是 x.__nonzero__() == 0 except AttributeError: x.__len__() == 0 except AttributeError: False .
【解决方案3】:

来自Python docs

如果参数为假,则运算符不产生 True,否则为 False。

表达式 x 和 y 首先计算 x;如果 x 为假,则返回其值;否则,计算 y 并返回结果值。

表达式 x 或 y 首先计算 x;如果 x 为真,则返回其值;否则,计算 y 并返回结果值。

Python 的or 运算符返回第一个Truth-y 值或最后一个值,然后停止。这对于需要备用值的常见编程任务非常有用。

就像这个简单的:

print my_list or "no values"

这将打印my_list,如果其中有任何内容。否则,它将打印no values(如果列表为空,或者它是None...)。

一个简单的例子:

>>> my_list = []
>>> print my_list or 'no values'
no values
>>> my_list.append(1)
>>> print my_list or 'no values'
[1]

使用and 的恭维,返回第一个 False-y 值或最后一个值并停止,当您需要保护而不是后备时使用。

喜欢这个:

my_list and my_list.pop()

这很有用,因为您不能在 None[] 上使用 list.pop,它们是列表的常见先验值。

一个简单的例子:

>>> my_list = None
>>> print my_list and my_list.pop()
None
>>> my_list = [1]
>>> print my_list and my_list.pop()
1

在这两种情况下都返回了非布尔值,并且没有引发异常。

【讨论】:

    【解决方案4】:

    需要为@Frédéric 的答案添加一些要点。

    返回其中一个操作数???

    这是真的,但这不是背后的逻辑。在python中,除了0之外的数字被认为是True,数字0被认为是False。

    (0 和 42 -> 假和真) = 假。

    这就是它返回 0 的原因。

    (0 或 42-> 假或真) = 42

    在这种情况下,由于操作数 42,该语句将为 True。因此在这种情况下,python 返回导致语句为 true 的操作数。

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2023-03-03
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多