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

92 python

我刚刚才知道有TruthyFalsy在Python这是与正常不同的价值观TrueFalse

是否有人可以深入解释什么truthyfalsy值?

我应该在哪里使用它们?

truthyTrue值以及falsyFalse值之间有什么区别?

Pat*_*ugh 154

所有值都被认为是"真实的",除了以下是"假的":

  • 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"值将符合执行检查ifwhile语句.我们使用"truthy"和"falsy"来区bool分值TrueFalse.

真值测试

  • @HaydenCrocker首先查找`__bool__`,然后查找`__len__`.如果两者都未定义,则所有实例都被视为"真".这在[`object .__ bool ___](https://docs.python.org/3/reference/datamodel.html#object.__bool__)方法的文档中讨论. (13认同)
  • @DavidKinghorn 这有道理,对吧?最小日期时间值只是一个像任何其他日期一样的日期,它无论如何都不像零。相比之下,`timedelta(0)` 就像零。当发现代表午夜的时间值是假的时就提出了这个问题,最终修复了:https://lwn.net/Articles/590299/ (5认同)
  • 好的清单,谢谢.完全是学术问题,但你知道执行顺序是什么吗?认为你可以创建一个对象,其中__bool__返回True而__len__返回0(反之亦然). (3认同)
  • 在3.5之前的Python版本中,代表午夜UTC的[时间对象](https://docs.python.org/3/library/datetime.html#time-objects)被认为是False。[本文](https://lwn.net/Articles/590299/)概述了有关该问题的错误报告以及最终的解决方案。 (3认同)
  • 有趣的是,对于 datetime 包,datetime.min 是真的,而 timedelta(0) 是假的。 (2认同)
  • `bytearray()`、`frozenset()`、`memoryview(b'')`、`{}.keys()`、`{}.items()`、`{}.values()` (2认同)

小智 61

正如所描述的注释,它只是引用被评估为True或False的值.

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

if len(my_list) != 0:
   print("Not empty!")
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

if my_list:
   print("Not empty!")
Run Code Online (Sandbox Code Playgroud)

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

类似地,对于整数0,空字符串""等等,对于False,非零整数,非空字符串等等,对于True.

像"truthy"和"falsy"这样的术语的概念仅仅指那些在上述情况下被认为是真的值,以及被认为是假的那些值.

例如,空列表([])被认为是"假",而非空列表(例如[1])被认为是"真实的".

另请参阅文档的此部分.


use*_*754 5

Python 通过应用bool()类型来确定真实性,该类型返回TrueFalse用于像ifor 之类的表达式中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
Run Code Online (Sandbox Code Playgroud)

注意:如果我们没有定义__bool__它总是返回 True,因为用户定义的类的实例在默认情况下被认为是真实的。

书中的例子:“精通Python,清晰、简洁、有效的编程”


adi*_*1ya 5

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

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
Run Code Online (Sandbox Code Playgroud)