Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是真假?它与真与假有何不同?_Python_Boolean Expression - Fatal编程技术网

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

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

我刚刚了解到python中有truthyfalsy值,它们不同于正常的
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
“truthy”值将满足
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中尝试这些东西,然后自己看看。。)<代码>如果我的列表