建议不是永远不要使用True、False或None。只是你不应该使用if x == True。

if x == True是愚蠢的,因为==只是一个二进制运算符!它的返回值为True或False,这取决于它的参数是否相等。如果condition为真,则if condition将继续。因此,当您编写if x == True时,Python将首先计算x == True,如果x是True,否则将变成True,如果结果是真的,则继续。但是如果您希望x是True或False,为什么不直接使用if x!

同样,x == False通常可以被not x替换。

在某些情况下,您可能需要使用x == True。这是因为if语句条件是“在布尔上下文中求值”的,以查看它是否是“truthy”,而不是完全针对True进行测试。例如,非空字符串、列表和字典都被if语句视为truthy,也被视为非零数值,但它们都不等于True。所以,如果你想测试一个任意的值是否是True的值,而不仅仅是它是否真实,当你使用if x == True时。但我几乎看不到它的用处。如果你真的需要写这篇文章,那么添加一条评论是非常罕见的,这样未来的开发人员(可能包括你自己)就不会认为== True是多余的,然后删除它。

相反,使用x is True实际上更糟。决不能将is与基本的内置不可变类型(如布尔值(True,False)、数字和字符串一起使用。原因是,对于这些类型,我们关心的是值,而不是标识。==测试这些类型的值是否相同,而is始终测试标识。

测试标识而不是值是不好的,因为一个实现在理论上可以构造新的布尔值,而不是去寻找现有的布尔值,这会导致有两个具有相同值的True值,但它们存储在内存中的不同位置,并且具有不同的标识。在实践中,我非常确定Python解释器总是重用True和False,因此不会发生这种情况,但这确实是一个实现细节。这个问题总是让人们对字符串感到困惑,因为直接出现在程序源代码中的短字符串和文本字符串被Python回收,所以'foo' is 'foo'总是返回True。但是很容易用两种不同的方法构造同一个字符串,并让Python赋予它们不同的标识。注意以下事项:>>> stars1 = ''.join('*' for _ in xrange(100))

>>> stars2 = '*' * 100

>>> stars1 is stars2

False

>>> stars1 == stars2

True

编辑:因此,Python在布尔上的相等性有点出乎意料(至少对我来说):>>> True is 1

False

>>> True == 1

True

>>> True == 2

False

>>> False is 0

False

>>> False == 0

True

>>> False == 0.0

True

正如the notes when bools were introduced in Python 2.3.5中所解释的,其基本原理是,使用整数1和0来表示真值和假值的旧行为是好的,但我们只希望对表示真值的数字使用更具描述性的名称。

实现这一点的一种方法是在内置代码中简单地包含True = 1和False = 0;然后1和True将无法区分(包括is)。但这也意味着返回True的函数将在交互式解释器中显示1,因此我们所做的是将bool创建为int的子类型。关于bool唯一不同的是str和repr;bool实例仍然具有与int实例相同的数据,并且仍然以相同的方式比较相等,因此True == 1。

因此,当x可能被某些代码设置为“True只是拼写1的另一种方式”时,使用x is True是错误的,因为有很多方法可以构造等于True但不具有相同标识的值:>>> a = 1L

>>> b = 1L

>>> c = 1

>>> d = 1.0

>>> a == True, b == True, c == True, d == True

(True, True, True, True)

>>> a is b, a is c, a is d, c is d

(False, False, False, False)

你错了se x == True当x可以是任意Python值时,您只想知道它是否是布尔值True。我们唯一确定的是,当您只想测试“真实性”时,最好使用x。谢天谢地,这通常是所有需要的,至少在我写的代码中!

更可靠的方法是x == True and type(x) is bool。但对于一个不太清楚的案子来说,这就太冗长了。通过执行显式类型检查,它看起来也不太像Python。。。但是,当您试图精确地测试True而不是truthy时,您所做的就是这样;duck类型的方法是接受truthy值,并允许任何用户定义的类声明自己是truthy的。

如果您正在处理这个非常精确的真理概念,其中您不仅不认为非空集合是真的,而且也不认为1是真的,那么只使用x is True可能是可以的,因为您大概知道x不是来自于认为1为真的代码。我不认为有任何纯python的方法可以产生另一个True,它位于不同的内存地址(尽管您可能可以从C中完成它),因此这不应该中断,尽管理论上是“错误的”事情。

我以前认为布尔人很简单!

结束编辑

然而,对于None,习惯用法是使用if x is None。在许多情况下,您可以使用if not x,因为None是if语句的“false”值。但是,如果您希望以相同的方式处理所有错误的值(零值数值类型、空集合和None),最好这样做。如果处理的值可能是其他值,也可能是指示“无值”的None(例如,当函数失败时返回None),那么最好使用if x is None,这样就不会在函数恰好返回空列表或数字0时意外假设函数失败。

我关于对不可变值类型使用==而不是is的参数建议您应该使用if x == None,而不是if x is None。然而,在None的情况下,Python确实显式地保证整个宇宙中只有一个None,并且普通的Python惯用代码使用is。

关于是返回None还是引发异常,这取决于上下文。

对于您的get_attr示例,我希望它引发异常,因为我将像do_something_with(get_attr(file))那样调用它。调用者通常的期望是,他们会得到属性值,让他们得到None,并假设是属性值,这比在找不到属性时忘记处理异常要危险得多。另外,返回None表示失败意味着None不是属性的有效值。在某些情况下,这可能是一个问题。

对于像see_if_matching_file_exists这样的虚函数,我们提供一个模式给它,它检查几个地方看是否有匹配,如果找到一个,它可以返回一个匹配,如果没有,它可以返回None。但是它也可以返回一个匹配列表;那么没有匹配只是空列表(这也是“false”;在这种情况下,我只需要使用if x来查看是否有任何东西回来。

因此,当在异常和None之间进行选择以指示失败时,必须确定None是否是预期的非失败值,然后查看调用函数的代码的预期值。如果“正常”的期望是返回一个有效值,并且只有偶尔调用方能够正常工作,无论是否返回有效值,那么您应该使用异常来指示失败。如果没有有效值是很常见的,那么调用者将期望处理这两个possi概率,然后可以使用None。

python中返回结果为true_在Python函数中使用True、False和None作为返回值相关推荐

  1. C语言编程>第十周 ⑦ 请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行……

    例题:请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回.一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始和结尾都没有空格. 请勿改 ...

  2. python一个函数调用另一个函数的返回值_在python函数中使用True,False和None作为返回值...

    建议不是你不应该使用True,False或None.这只是你不应该使用如果x == True. 如果x == True是愚蠢的,因为==只是一个二进制运算符!它的返回值为True或False,取决于它 ...

  3. python库和模块的区别_在函数中导入python库与全局导入之间有何区别?

    假设我要导入一个在函数内部使用的python库.在函数中导入库还是在全局范围内导入更好? 做这个 def test_func: import pandas as pd # code implement ...

  4. python关键字参数必须位于位置参数之前_python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)...

    默认参数:定义函数的时候给定变量一个默认值. def num(age=1): 位置参数:调用函数的时候根据定义函数时的形参位置和实参位置进行引用. 关键字参数:如果定义的函数中含有关键字参数,调用函数 ...

  5. python中可选参数和可变参数_Python函数中的可变长参数详解

    一.Python函数中的参数 1.使用python的函数时,有参数类别,比如位置参数.关键字参数.可变长参数 2.位置参数.关键字参数很好理解,关键是可变长参数经常能见到,但是一直没有搞懂是什么意思 ...

  6. C语言中函数返回的字符数组为null——函数中的局部字符数组

    今天在刷题时,碰到这样一个问题,我定义的函数要求返回的是字符串,我在函数中定义了一个字符数组来表示,但是运行时发现函数的返回值为空. 解决方法: 方法1:将字符数组定义为全局变量 方法2:用stati ...

  7. c 语言 函数返回数组_如何在C ++函数中返回数组

    c 语言 函数返回数组 介绍 (Introduction) In this tutorial, we are going to understand how we can return an arra ...

  8. python怎么停止正在运行的代码_在python中,如何停止正在执行的函数中的代码?...

    在Python3.2中,有没有一种方法可以停止函数的其余部分的执行?在 基本上,我正在创建一个登录系统作为我的课程作业的一个概念,但我在任何地方都找不到答案.在 我的代码分为两个文件,一个logger ...

  9. oracle返回表id,在Oracle的函数中,返回表类型的语句

    Oracle的function中怎么返回表变量? 太晚了,过多的理论知识就不说了,下面简单地说实现吧!.. 1.创建表对象类型. 在Oracle中想要返回表对象,必须自定义一个表类型,如下所示: 复制 ...

最新文章

  1. 机器学习典型步骤以及训练集、验证集和测试集概念
  2. ajax传递数组 php,jQuery.ajax向后台传递数组问题如何解决
  3. 从理论角度理解L1、L2正则化
  4. Team Foundation Server 2010 安装、部署与配置(三):安装 .
  5. mysql 客户端乱码_Mysql客户端中文乱码问题解决
  6. 存储过程系列之存储过程返回值总结
  7. 【CNN长文详解】大话卷积神经网络CNN(干货满满)
  8. 通过分析如何一个人的性格笔迹?
  9. 【优化求解】基于matlab遗传算法结合粒子群算法求解单目标优化问题【含Matlab源码 1659期】
  10. python 爬取视频ts文件_python爬取视频网站中video标签的m3u8文件与ts文件
  11. 大学学习历程简单总结
  12. 软件测试背景目的要点概述
  13. 多 “维” 优化——前端高并发策略的更深层思考
  14. python 3d pca_python – matplotlib中的3D PCA:如何添加图例?
  15. Django 中针对基于类的视图添加 csrf_exempt
  16. 基于stm32无线充电器设计
  17. 数据探查平台-元数据对标专利 -- 普帝
  18. inet_aton函数
  19. Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机
  20. 制造业数字化转型评价指标体系构建与应用

热门文章

  1. office 2016安装包下载
  2. 使用SSM框架整合时,无法创建XXXXBean
  3. 惠州周边适合春游的好地方
  4. Python — 函数进阶(2)
  5. 复现计算机论文模型,深度学习模型复现难?看看这篇句子对模型的复现论文
  6. JAVA电影院售票网站计算机毕业设计Mybatis+系统+数据库+调试部署
  7. MAC下linux双系统的安装
  8. LTspice基础教程-025.电路容差分析,蒙特卡罗分析(Monte Carlo)
  9. tools1.0.2
  10. 【抽屉原理】C. Dominant Character