什么是蟒蛇中的Truthy和Falsy?它与真与假有什么不同?

时间:2016-10-11 18:00:56

标签: python

我刚才知道python中有 Truthy Falsy 值,这些值与普通TrueFalse不同?

有人可以请深入解释 truthy falsy 值是什么?

我应该在哪里使用它们?

truthy True值以及 falsy False值有什么区别?

8 个答案:

答案 0 :(得分:123)

所有价值观都被视为"真实的"除了以下内容,其中包括" falsy":

  • 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

A" truthy" value将满足ifwhile语句执行的检查。我们使用" truthy"和" falsy"区别于boolTrueFalse

Truth Value Testing

答案 1 :(得分:46)

正如所描述的评论,它只是指被评估为True或False的值。

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

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

你可以这样做:

if my_list:
   print "Not empty!"

这是因为在评估布尔值时,某些值(例如空列表)被视为False。非空列表为True。

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

“truthy”和“falsy”等术语的概念只是指那些在上述情况下被认为是真的值,以及那些被认为是假的值。

例如,空列表([])被视为“虚假”,非空列表(例如[1])被视为“真实”。

另见this section of the documentation

答案 2 :(得分:3)

Python通过对类型应用bool()来确定真实性,该类型将返回TrueFalse,该类型用于ifwhile之类的表达式中。

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

这本书的示例:“精通Python,清晰,简洁,有效的编程”

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

您应在哪里使用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"

不过,只要您愿意,就可以坚持使用这种编码样式。

答案 5 :(得分:0)

Python将值转换为布尔值,以确定真值和假值。

例如 is_old = 49实际上会解释为is_old = bool(49), 依次返回True

另一个例子 is_string =''将返回false,因为空字符串将被解释为false

答案 6 :(得分:0)

如果if (!id) {}

!expr 返回 false,如果它的单个操作数可以转换为 true;否则,返回 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

而在 if (id != null) {} 的情况下,它只会检查 id 中的值是否不等于 null

参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT

答案 7 :(得分:-3)

Falsy表示空值,例如空列表,元组,任何具有空值或无的数据类型。 真实的意思是: 除了真相