什么是 Truthy 和 Falsy?它与 True 和 False 有何不同?
What is Truthy and Falsy? How is it different from True and False?
我刚了解到 python 中有 truthy 和 falsy 值,这与正常 True
和 False
.
有人可以深入解释一下 truthy 和 falsy 值是什么吗?我应该在哪里使用它们? truthy 和 True
值与 falsy 和 False
值有什么区别?
如评论所述,它仅指评估为 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"。
所有值都被认为是“真实的”,除了以下是“虚假的”:
None
False
- 零个,包括:
- 空序列和集合,包括:
[]
- 一个空 list
{}
- 一个空 dict
()
- 一个空 tuple
''
- 一个空 str
b''
- 一个空 bytes
set()
- 一个空 set
- 空
range
,如range(0)
- 对象
obj.__bool__()
returns False
obj.__len__()
returns 0
“真实”值将满足 if
或 while
语句执行的检查。我们使用“truthy”和“falsy”来区分 bool
值 True
和 False
.
Python 通过将 bool()
应用于类型来确定真实性,returns True
或 False
用于 if
或 while
。
这是自定义 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
表示真,除非另有说明。
我刚了解到 python 中有 truthy 和 falsy 值,这与正常 True
和 False
.
有人可以深入解释一下 truthy 和 falsy 值是什么吗?我应该在哪里使用它们? truthy 和 True
值与 falsy 和 False
值有什么区别?
如评论所述,它仅指评估为 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"。
所有值都被认为是“真实的”,除了以下是“虚假的”:
None
False
- 零个,包括:
- 空序列和集合,包括:
[]
- 一个空list
{}
- 一个空dict
()
- 一个空tuple
''
- 一个空str
b''
- 一个空bytes
set()
- 一个空set
- 空
range
,如range(0)
- 对象
obj.__bool__()
returnsFalse
obj.__len__()
returns0
“真实”值将满足 if
或 while
语句执行的检查。我们使用“truthy”和“falsy”来区分 bool
值 True
和 False
.
Python 通过将 bool()
应用于类型来确定真实性,returns True
或 False
用于 if
或 while
。
这是自定义 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
表示真,除非另有说明。