什么是 Truthy 和 Falsy?它与 True 和 False 有何不同?

What is Truthy and Falsy? How is it different from True and False?

我刚了解到 python 中有 truthyfalsy 值,这与正常 TrueFalse.

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

如评论所述,它仅指评估为 True 或 False 的值。

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

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

您可以简单地这样做:

if my_list:
   print("Not empty!")

这是因为某些值(例如空列表)在计算布尔值时被视为 False。非空列表为真。

同样对于整数0,空字符串“”等,为False,非零整数,非空字符串等,为True。

"truthy" 和 "falsy" 等术语的概念只是指那些在上述情况下被认为是 True 的值,以及那些被认为是 False 的值。

例如,一个空列表([])被认为是"falsy",一个非空列表(例如,[1])被认为是"truthy"。

另见 this section of the documentation

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

  • None
  • False
  • 零个,包括:
  • 空序列和集合,包括:
    • [] - 一个空 list
    • {} - 一个空 dict
    • () - 一个空 tuple
    • '' - 一个空 str
    • b'' - 一个空 bytes
    • set() - 一个空 set
    • range,如range(0)
  • 对象
    • obj.__bool__() returns False
    • obj.__len__() returns 0

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

Truth Value Testing

Python 通过将 bool() 应用于类型来确定真实性,returns TrueFalse 用于 ifwhile

这是自定义 class Vector2d 的示例,它是 returning False 的实例,当大小(向量的长度)为 0 时,否则 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__ 它总是 return 正确,作为用户定义的实例 class 默认情况下被认为是真实的。

书中的例子:"Fluent in Python, clear, concise and effective programming"

Truthy 值是指在布尔上下文中使用的对象,而不是 returns true 或 false.Take 的布尔值,例如:

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

你应该在哪里使用 Truthy 或 Falsy 值? 这些是语法糖,所以你总是可以避免它们,但是使用它们可以让你的代码更具可读性,让你更有效率。 此外,您会在许多代码示例中找到它们,无论是否在 python 中,因为它被认为是很好的做法。

如其他答案中所述,您可以在 if 测试和 while 循环中使用它们。这是 python 3 中的另外两个示例,其中默认值与 or 组合,s 是一个字符串变量。你也会扩展到类似的情况。

没有真相

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

用truthy更简洁:

print(s or 'Default value')

在python3.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"

不过,如果您觉得舒服,您可以坚持这种编码风格。

Falsy 表示空的东西,如空列表、元组,任何具有空值或 None 的数据类型。 真实的意思是: 除了 Truthy

如果if (!id) {}

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

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

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

null;

NaN;

0;

empty string ("" or '' or ``);

undefined.

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

示例:

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

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

以下值被视为 False

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

考虑所有其他值 True -- 因此许多类型的对象始终为真。

具有布尔结果的运算和内置函数始终 return 0 或 False 表示假,1 或 True 表示真,除非另有说明。