【问题标题】:What is Truthy and Falsy? How is it different from True and False?什么是真假?它与真假有什么不同?
【发布时间】:2017-02-20 09:00:52
【问题描述】:

我刚刚了解到,python 中有 truthyfalsy 值与普通的 TrueFalse 不同。

谁能深入解释一下truthyfalsy值是什么?我应该在哪里使用它们? truthyTrue 值与 falsyFalse 值有什么区别?

【问题讨论】:

  • 如果bool(value) 的结果是True,那么value真实的
  • 这些词是你自己发明的,不是吗?无论如何,请参阅 __nonzero____bool__
  • Truthy/Falsy 值只是为您需要某种二进制测试的情况提供便利。它允许编写更简单的代码,而且更简单的代码通常更易于阅读,并且出现错误的机会更少。
  • @zvone 如果编程语言没有布尔值,则真假通常用于代码高尔夫。
  • @zvone: 'Truthy' 和 'falsy' 在比较编程语言时被广泛使用,例如PHP vs PERL vs Python vs JS。 (绝对不仅仅是代码高尔夫)。

标签: python boolean-expression


【解决方案1】:

所有值都被认为是“真实的”,除了以下是“虚假的”:

  • None
  • False
  • 0
  • 0.0
  • 0j
  • decimal.Decimal(0)
  • fraction.Fraction(0, 1)
  • [] - 一个空的list
  • {} - 一个空的dict
  • () - 一个空的tuple
  • '' - 一个空的str
  • b'' - 一个空的bytes
  • set() - 一个空的set
  • 一个空的range,比如range(0)
  • 对象
    • obj.__bool__() 返回False
    • obj.__len__() 返回0

“真实”值将满足ifwhile 语句执行的检查。我们使用“truthy”和“falsy”来区分boolTrueFalse

Truth Value Testing

【讨论】:

  • 很棒的清单,谢谢。完全是学术问题,但你知道执行顺序是什么吗?正在考虑您可以创建一个对象,其中 bool 返回 True 并且 len 返回 0(反之亦然)。
  • @HaydenCrocker 它首先查找__bool__,然后是__len__。如果两者都未定义,则所有实例都被视为“真”。这在object.__bool__ 方法的文档中进行了讨论
  • 在 Python 3.5 之前的版本中,代表午夜 UTC 的 time objects 被认为是 False。 This article 概述了该问题的错误报告和最终解决方案。
  • 有趣的是 datetime 包,datetime.min 是真的,而 timedelta(0) 是假的。
  • @DavidKinghorn 这很有道理,对吧?最小日期时间值只是一个日期,就像任何其他日期一样,它绝不像零。相比之下,timedelta(0) 就像零。当发现表示午夜的时间值是虚假的时,这个问题就被提出来了,最终得到了修复:lwn.net/Articles/590299
【解决方案2】:

正如 cmets 所描述的,它只是指被评估为 True 或 False 的值。

例如,查看列表是否不为空,而不是像这样检查:

if len(my_list) != 0:
   print("Not empty!")

你可以这样做:

if my_list:
   print("Not empty!")

这是因为某些值(例如空列表)在评估布尔值时被视为 False。非空列表为 True。

对于整数 0、空字符串“”等类似,对于 False,非零整数、非空字符串等等,对于 True。

“真”和“假”等术语的概念只是指那些在上述情况下被认为是真的值,以及那些被认为是假的值。

例如,空列表 ([]) 被认为是“假的”,非空列表(例如,[1])被认为是“真实的”。

另见this section of the documentation

【讨论】:

  • 我建议在 Python shell 中尝试这些东西并亲眼看看。 ;) if my_list 表示“如果 my_list 不为空”,if not my_list 表示“如果 my_list 为空”。
  • 好吧,我最近有点困惑,我见过很多地方,比如if a: 这种情况意味着什么?是表示 a 为真还是表示 a 为假?或者这意味着如果 a 是真的还是 a 是假的?
  • 表示“如果 a 为真”。正如我在回答中所描述的那样,正如其他人在 cmets 和其他答案中所描述的那样,不同的事情被认为是对或错,但实际上并非如此。例如,一个空列表被认为是 False。这就是if []: 永远不会执行的原因。
  • 表示 if a: 表示 a 是否为真(当 a 为整数或字符串时)如果 a: 表示如果 a 为空列表或空字典或假值则为假!
  • 是的,假设我理解正确。 ^_^
【解决方案3】:

Python 通过将bool() 应用于类型来确定真实性,该类型返回TrueFalse,在ifwhile 等表达式中使用。

这是一个自定义类Vector2d的示例,当幅度(向量的长度)为0时,它的实例返回False,否则为True

import math
class Vector2d(object):
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

    def __abs__(self):
        return math.hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

a = Vector2d(0,0)
print(bool(a))        #False
b = Vector2d(10,0)    
print(bool(b))        #True

注意:如果我们没有定义__bool__,它将始终返回 True,因为默认情况下用户定义类的实例被认为是真实的。

书中的例子:《流利的Python,清晰、简洁、有效的编程》

【讨论】:

    【解决方案4】:

    真值是指在布尔上下文中使用的对象,而不是返回true或false的布尔值。以这些为例:

    >>> bool([])
    False
    >>> bool([1])
    True
    >>> bool('')
    False
    >>> bool('hello')
    True
    

    【讨论】:

      【解决方案5】:

      你应该在哪里使用真值或假值? 这些是语法糖,因此您始终可以避免使用它们,但使用它们可以使您的代码更具可读性并提高您的效率。 此外,无论是否使用 python,您都会在许多代码示例中找到它们,因为这被认为是一种很好的做法。

      正如其他答案中提到的,您可以在 if 测试和 while 循环中使用它们。这是 python 3 中的另外两个示例,它们的默认值与 ors 组合为字符串变量。您还将扩展到类似的情况。

      没有真相

      if len(s) > 0:
          print(s)
      else:
          print('Default value')
      

      用truthy更简洁:

      print(s or 'Default value')
      

      在python 3.8中,我们可以利用赋值表达式:=

      没有真相

      if len(s) == 0:
          s = 'Default value'
      do_something(s)
      

      truthy 也更短

      s or (s := 'Default value')
      do_something(s)
      

      甚至更短,

      do_something(s or (s := 'Default value'))
      

      不用赋值表达式也可以

      s = s or 'Default value'
      do_something(s)
      

      但不短。有些人觉得s =... 行不满意,因为它对应于

      if len(s)>0:
          s = s # HERE is an extra useless assignment
      else:
          s = "Default value"
      

      不过,如果您对这种编码风格感到满意,您可以坚持使用它。

      【讨论】:

        【解决方案6】:

        Python 中的任何对象都可以测试其真值。它可以用在 if 或 while 条件中,也可以用作布尔运算的操作数。

        以下值被视为False

        • None
        • False
        • 任何数字类型的零,例如,0、0L、0.0、0j。
        • 任何空序列,例如,''、()、[]。
        • 任何空映射,例如 {}。
        • 用户定义类的实例,如果该类定义了__nonzero__()__len__() 方法,则当该方法返回整数零或布尔值False

        所有其他值都被视为True——因此许多类型的对象始终为真。

        除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0 或 False 表示 false 和 1 或 True 表示 true。

        【讨论】:

          【解决方案7】:

          如果是if (!id) {}

          !expr 如果其单个操作数可以转换为true,则返回false;否则,返回true

          如果一个值可以转换为true,那么这个值就是所谓的truthy。如果一个值可以转换为false,那么这个值就是所谓的falsy。

          可以转换为 false 的表达式示例有:

          null;
          
          NaN;
          
          0;
          
          empty string ("" or '' or ``);
          
          undefined.
          

          即使! 运算符可以与非布尔值的操作数一起使用,它仍然可以被视为布尔运算符,因为它的返回值总是可以转换为布尔原语。要将其返回值(或一般的任何表达式)显式转换为相应的布尔值,请使用双非运算符或布尔构造函数。

          例子:

          n1 = !null               // !t returns true
          n2 = !NaN              // !f returns true
          n3 = !''                 // !f returns true
          n4 = !'Cat'              // !t returns false
          

          if (id != null) {}的情况下,它只会检查id中的值是否不等于null

          参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT

          【讨论】:

            【解决方案8】:

            Falsy 表示空的东西,比如空列表、元组,以及任何具有空值或 None 的数据类型。 诚实的意思: 除了说实话

            【讨论】:

              猜你喜欢
              • 2019-01-30
              • 2018-07-01
              • 1970-01-01
              • 2014-09-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多