Python 什么是真假?它与真与假有何不同?
我刚刚了解到python中有truthy和falsy值,它们不同于正常的Python 什么是真假?它与真与假有何不同?,python,boolean-expression,Python,Boolean Expression,我刚刚了解到python中有truthy和falsy值,它们不同于正常的True和False 有人能深入解释什么是真实和虚假的价值观吗?我应该在哪里使用它们?truthy和True值与falsy和False值之间有什么区别?正如注释所述,它只是指评估为True或False的值 例如,要查看列表是否为空,请不要这样检查: if len(my_list) != 0: print("Not empty!") 您可以简单地执行以下操作: if my_list: print("Not emp
True
和False
有人能深入解释什么是真实和虚假的价值观吗?我应该在哪里使用它们?truthy和
True
值与falsy和False
值之间有什么区别?正如注释所述,它只是指评估为True或False的值
例如,要查看列表是否为空,请不要这样检查:
if len(my_list) != 0:
print("Not empty!")
您可以简单地执行以下操作:
if my_list:
print("Not empty!")
这是因为某些值(如空列表)在为布尔值求值时被视为False。非空列表为True
类似地,对于整数0、空字符串“”等等,对于False,对于非零整数、非空字符串等等,对于True
“truthy”和“falsy”等术语的概念只是指在上述情况下被视为正确的价值观,以及被视为错误的价值观
例如,空列表([]
)被认为是“虚假的”,而非空列表(例如,[1]
)被认为是“真实的”
另请参见。所有值都被视为“真实”,但以下值除外,它们是“虚假的”:
None
False
0
0.0
0j
-空的[]
列表
-一个空的{}
dict
-空的()
元组
-一个空的'
str
-一个空的b'
字节
-空的set()
set
- 空的
,如范围
范围(0)
- 对象的
返回obj.\uuubool\uuuu()
False
返回obj.\uuu len\uuu()
0
if
或while
语句执行的检查。我们使用“truthy”和“falsy”来区分bool
值True
和False
Python通过对类型应用
bool()
来确定真实性,该类型返回True
或False
,这在表达式中使用,如if
或while
下面是一个自定义类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
注意:如果我们没有定义\uuuu bool\uuuu
,它将始终返回True,因为默认情况下用户定义类的实例被视为truthy
书中的示例:“流畅的Python,清晰、简洁和有效的编程”Truthy值指的是在布尔上下文中使用的对象,而不是返回true或false的布尔值。以这些为例:
>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
你应该在哪里使用真实或虚假的价值观? 这些都是语法上的糖分,所以你可以避免它们,但是使用它们可以让你的代码更可读,效率更高。 此外,您将在许多代码示例中找到它们,无论是否在python中,因为这被认为是良好的实践 正如其他答案中提到的,您可以在if测试和while循环中使用它们。下面是python 3中的另外两个示例,它们的默认值与
或组合在一起,s
是一个字符串变量。您还将扩展到类似的情况
没有真实
if len(s) > 0:
print(s)
else:
print('Default value')
if len(s) == 0:
s = 'Default value'
do_something(s)
对于truthy,它更简洁:
print(s or 'Default value')
在python 3.8中,我们可以利用赋值表达式:=
没有真实
if len(s) > 0:
print(s)
else:
print('Default value')
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表示空列表、元组之类的内容,就像任何具有空值或无值的数据类型一样。
真实的意思是:
如果(!id){}
!!如果expr的单个操作数可以转换为true
,则返回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
如果一个值可以转换为true,那么该值就是所谓的truthy。如果一个值可以转换为false,那么该值就是所谓的falsy
可转换为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
而在的情况下,如果(id!=null){}
它将只检查id中的值是否不等于null
参考如果bool(value)
结果为True
,那么value
是真实的。这些词是你自己发明的,不是吗?无论如何,对于需要某种二进制测试的情况,see和Truthy/Falsy值只是一种方便。它允许编写更简单的代码,而且更简单的代码通常更容易阅读,出现错误的机会更少。@zvone Truthy和falsy通常用于代码高尔夫,如果编程语言没有布尔值。@zvone:“Truthy”和“falsy”广泛用于比较编程语言,例如PHP与PERL、Python与JS。(绝对不仅仅是代码高尔夫)。我建议在Python shell中尝试这些东西,然后自己看看。。)<代码>如果我的列表