什么是真与假? 它与真与假有什么不同?

我刚刚了解到在 python 中有 真心话假的值,它们不同于正常的 TrueFalse

谁能深入解释一下 真心话假的的值是什么?我应该在哪里使用它们?真心话True值与 假的False值的区别是什么?

90540 次浏览

正如注释所描述的,它只是引用计算为 True 或 False 的值。

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

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

你可以这样做:

if my_list:
print("Not empty!")

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

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

像“ truthy”和“ False”这样的术语仅仅是指那些在上面描述的情况下被认为是 True 的值,以及那些被认为是 False 的值。

例如,空列表([])被认为是“ false”,而非空列表(例如,[1])被认为是“ truthy”。

参见 文件的这一部分

我们使用“ truthy”和“ false”来区分 boolTrueFalse。“ true”值将满足由 ifwhile语句执行的检查。正如 在文件中解释的那样,所有值都被认为是“真实的”,除了以下“假的”:

  • None
  • False
  • 数值等于零的数字,包括:
  • 空序列和集合,包括:
    • 一个空的 list
    • 一个空的 dict
    • 一个空的 tuple
    • 一个空的 set
    • 一个空的 str
    • 一个空的 bytes
    • 一个空的 bytearray
    • 一个空的 memoryview
    • 一个空的 range,就像 range(0)
  • 对象
    • 返回 False
    • 如果 obj.__bool__未定义,则 obj.__len__()返回 0

Python 通过对类型应用 bool()来确定真实性,该类型返回 TrueFalseTrueFalseifwhile等表达式中使用。

下面是一个自定义类 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,因为默认情况下用户定义类的实例被认为是 True。

书中的例子: “流利的 Python 语言,清晰、简洁和有效的编程”

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

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

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

正如在其他答案中提到的,您可以在 if 测试和 while 循环中使用它们。下面是 python3中的另外两个示例,它们的默认值与 or组合在一起,s是一个字符串变量。您也将扩展到类似的情况。

没有真相

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

与“真实”相比,它更加简洁:

print(s or 'Default value')

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

没有真相

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

如果是真的,它也会更短

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 表示空值,如空列表、元组,以及任何具有空值或无的数据类型。 真实的意思是: 除了真相

if (!id) {}的情况下

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

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

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

null;


NaN;


0;


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


undefined.

即使 !运算符可以与非布尔值的操作数一起使用,它仍然可以被认为是布尔运算符,因为它的返回值总是可以转换为布尔原语。若要显式地将其返回值(或一般的任何表达式)转换为相应的布尔值,请使用双 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。
  • 任何空序列,例如,”,() ,[]。
  • 任何空映射,例如,{}。
  • 如果用户定义的类定义了 __nonzero__()__len__()方法,则该方法返回整数零或布尔值 False

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

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