我刚刚才知道有Truthy和Falsy值在Python这是从正常的不同True
和False
?
有人可以深入解释什么是真实和虚假的价值观吗?
我应该在哪里使用它们?
是什么区别truthy和True
值和falsy和False
价值观?
__nonzero__
和__bool__
我刚刚才知道有Truthy和Falsy值在Python这是从正常的不同True
和False
?
有人可以深入解释什么是真实和虚假的价值观吗?
我应该在哪里使用它们?
是什么区别truthy和True
值和falsy和False
价值观?
__nonzero__
和__bool__
Answers:
如评论所述,它仅指评估为True或False的值。
例如,查看列表是否不为空,而不是像这样检查:
if len(my_list) != 0:
print("Not empty!")
您可以简单地做到这一点:
if my_list:
print("Not empty!")
这是因为在评估布尔值时,某些值(例如空列表)被视为False。非空列表为True。
类似地,对于整数0,对于False,空字符串“”,依此类推;对于True,对于非零整数,非空字符串,依此类推。
像“真实的”和“虚假的”这样的术语的概念仅指那些在上述情况下被认为是True的值,以及被认为是False的那些值。
例如,一个空列表([]
)被视为“虚假”,而一个非空列表(例如[1]
)被视为“真实”。
另请参阅本节。
if my_list
表示“如果my_list不为空”,if not my_list
表示“如果my_list为空”。
if []:
永远不会执行的原因。
除以下值“ fassy”外,所有值均被视为“真实”值:
None
False
0
0.0
0j
Decimal(0)
Fraction(0, 1)
[]
-一个空的 list
{}
-一个空的 dict
()
-一个空的 tuple
''
-一个空的 str
b''
-一个空的 bytes
set()
-一个空的 set
range
,像range(0)
obj.__bool__()
退货 False
obj.__len__()
退货 0
“真实的”值将满足if
或while
语句执行的检查。我们使用“真实的”和“虚假的”来区别bool
值True
和False
。
timedelta(0)
就像零。当发现表示午夜的时间值是虚假的时就提出来了,这个问题最终得到了解决:lwn.net/Articles/590299
Python通过应用bool()
类型来确定真实性,该类型返回True
或False
在诸如if
或的表达式中使用while
。
这是一个自定义类Vector2d
的示例,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__
,它将始终返回True,因为默认情况下,用户定义类的实例被认为是真实的。
书中的示例:“精通Python,清晰,简洁,有效的编程”
您应该在哪里使用Truthy或Falsy值?这些是语法糖,因此您始终可以避免使用它们,但是使用它们可以使您的代码更具可读性并提高效率。此外,无论是否在python中,您都会在许多代码示例中找到它们,因为这被认为是一种好习惯。
如其他答案所述,您可以在if测试和while循环中使用它们。下面是在Python 3另外两个例子与组合的默认值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"
但是,如果您愿意的话,可以遵循这种编码风格。
bool(value)
导致True
,那value
就是事实。