python中返回结果为true_在Python函数中使⽤True、False和
None作为返回值
建议不是永远不要使⽤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是多余的,然后删除它。
false是什么函数
相反,使⽤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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。