【问题标题】:Why do Types return True in Python?为什么类型在 Python 中返回 True?
【发布时间】:2015-09-03 18:33:09
【问题描述】:

我的理解是否正确,if 语句只有在评估 True 时才会“执行”?

如果是这样,types 返回True 的目的是什么?

这条规则背后的逻辑是什么?

有人可以举个例子说明它在哪里有用吗?

示例:

""" Example """

def test(x):
    if float:
        print("success")

test(9)
test('\ntesting')

返回:

【问题讨论】:

  • 是的,这就是我的问题:为什么类型返回 true?我的问题不是:为什么将 True 返回到 If 语句会执行 if 语句的主体。
  • Why do types return true? 阅读文档,上面写着All other values are considered true。基本上一些特定的值是 False,其他的都是 True。
  • 供将来参考:如果您只包含与您的特定问题相关的代码,即if float: print('float is true?'),您将不会感到困惑。在您的示例中,您有一个传递参数并使用不同参数调用它的函数这一事实非常令人困惑,并导致至少有一个与问题无关的答案。
  • @RubenBaden 别担心。从更大的例子中提取问题的根源是一项需要培养的技能;我只是想帮助发展这项技能。

标签: python python-3.x if-statement types


【解决方案1】:

来自文档:

可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。以下 值被认为是错误的:

错误

任何数字类型的零,例如,0、0L、0.0、0j。

任何空序列,例如,''、()、[]。

任何空映射,例如 {}。

用户定义类的实例,如果该类定义了一个 __nonzero__() 或 __len__() 方法,当该方法返回整数零或布尔值 False 时。 [1]

> 所有其他值都被认为是真的——所以许多类型的对象都是 总是正确的。

始终具有布尔结果的操作和内置函数 返回 0 或 False 表示假,1 或 True 表示真,除非另有说明 表示。 (重要的例外:布尔运算 or 和 and 总是 返回其中一个操作数。)

由于所有类型都派生自对象,__nonzero__ 不返回 False 或整数零,并且它们没有 __len__ 方法,因此被视为 True。

还有一件有趣的事: 浮动的__nonzero__<slot wrapper '__nonzero__' of 'float' objects>

以下是一些相关信息: What is a wrapper_descriptor, and why is Foo.__init__() one in this case?

【解决方案2】:

所有对象(包括类型,它们是type 的实例)本质上都是正确的,因为它们表示存在基础类型的值,而None 则表示不存在任何类型的值。 (None 仅仅因为它是 NoneType 的一个实例而评估为 true 是没有用的。)

某些类型的某些实例(空字符串和容器类型的空实例,仅举几例)评估为 False,因为这样考虑它们很方便。

在您自己的类中,您可以覆盖特定实例的真值,方法是覆盖 __nonzero____len__ 以返回特定实例的 0 或 False

【讨论】:

  • 我将 Float 替换为 None,但打印失败!非常感谢您的回答。现在对我来说很有意义!
【解决方案3】:

基本问题是:

这条规则背后的逻辑是什么?

此规则用于定义 Python(应该)如何操作:只要有一个 if 语句的值不是 TrueFalse,结果就应该是清晰的。所有实现都一样!

它确实暗示这是一种很好的风格。也不应该使用它

if float(3.14):
    print("is not a proper way to program")
 else:
    print("even it is clearly defined what will happen")

个人,我不知道会打印什么。而且我不会查它,因为无论如何它都很糟糕。我总是告诉我的班级:“即使编译器理解它,你的大学也不会”

【讨论】:

  • 你是说利用像if my_list:if result: 这样的真假值是不应该使用的糟糕风格?
  • 视情况而定。对与错,每个人都清楚。如果您的听众不是专家,请坚持下去。但是,例如,库代码仅供专家阅读,因此允许使用更多类型。个人
  • 如果你的听众不是专家,你应该告诉他们真实和虚假的价值观,而不是向他们展示虚假、糟糕的代码。
  • 你是什么意思,“相信一个空的是假的”?当然,一个空的list 评估为一个错误的值。这完全是故意的,它的目的是让你编写更整洁、更清晰的代码。编写避免这个事实的代码(加上你任意认为不可用的任何其他语言特性)只会导致代码更糟糕,并且在任何情况下将其用作任何类型的教学辅助工具只会让读者对 Python 的理解更差。这个答案非常具有误导性。
  • 没有。这绝不是糟糕的风格,你的回答基本上说它总是糟糕的风格。就个人而言,如果我发布了这样一个误导性、有害的答案,然后被告知它有多糟糕,我会删除它。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 2021-07-02
  • 2019-12-07
  • 2017-12-17
  • 2021-09-02
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
相关资源
最近更新 更多