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

建议不是你不应该使用True,False或None。这只是你不应该使用如果x == True。

如果x == True是愚蠢的,因为==只是一个二进制运算符!它的返回值为True或False,取决于它的参数是否相等。如果条件为真,则条件将继续。所以当你写如果x == True Python将首先评估x == True,如果x是True和False否则将变为True,然后继续,如果结果是真的。但是如果你期望x是True或False,为什么不直接使用x?

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

在某些情况下,你可能想使用x == True。这是因为if语句条件是“在布尔上下文中评估”,以查看它是否为“真实”,而不是完全对照True。例如,非空字符串,列表和字典都被if语句视为真实的,以及非零数字值,但这些都不等于True。所以如果你想测试一个任意值是否正确的值True,不只是它是否为真,当你会使用如果x == True。但我几乎从来没有看到一个用途。它是如此罕见,如果你需要写,这是值得添加一个评论,所以未来的开发人员(包括可能自己)不只是假设== True是多余的,并删除它。

使用x是真的,而实际上更糟。你永远不应该使用基本的内置不可变类型,如布尔值(True,False),数字和字符串。原因是,对于这些类型,我们关心价值,而不是身份。 ==测试这些类型的值是否相同,而始终是测试标识。

测试标识而不是值是坏的,因为一个实现可以理论上构造新的布尔值,而不是去找到现有的值,导致您有两个True值具有相同的值,但存储在不同的内存中,具有不同的身份。在实践中我很确定True和False总是被Python解释器重用,所以这不会发生,但这是一个实现细节。这个问题使人们一直使用字符串,因为直接出现在程序源中的短字符串和字符串会被Python重用,所以’foo’是’foo’总是返回True。但是很容易构造相同的字符串2种不同的方式,并让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和False的旧行为是好的,但是我们只是想要更多描述性的名称用于表示真值的数字。

一种实现方法是在内置函数中只有True = 1和False = 0;那么1和True真的会无法区分(包括by)。但这也意味着一个函数返回True将在交互式解释器中显示为1,因此所做的是将bool创建为int的子类型。唯一不同的是bool是str和repr; bool实例仍然具有与int实例相同的数据,并且仍然以相同的方式比较等式,所以True == 1。

所以这是错误的使用x是True,当x可能已经设置了一些代码,希望“真是只是另一种方式拼写1”,因为有很多方法来构造值等于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)

并且使用x == True是错误的,当x可以是一个任意的Python值,你只想知道它是否是布尔值True。我们唯一确定的是,只是使用x是最好的,当你只是想测试“诚实”。幸好这通常是所有必需的,至少在我写的代码!

一个更确定的方式是x == True和type(x)是bool。但是对于一个很晦涩的情况,这变得很冗长。它也不看起来非常Pythonic通过进行显式类型检查…但这真的是你在做什么,当你试图精确测试True而不是真实;鸭式键入方式将接受真值,并允许任何用户定义的类声明自己是真实的。

如果你处理这个非常精确的真理概念,你不仅不认为非空集合是真的,但也不认为1是真的,那么只是使用x是True可能是好的,因为大概那么你知道x没有来自认为1是真的代码。我不认为有任何纯python的方式来提出另一个True,生活在一个不同的内存地址(虽然你可能从C做),所以这不应该打破,尽管理论上是“错误的”事情去做。

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

结束编辑

然而,在None的情况下,如果x是None,则使用惯用法。在许多情况下,你可以使用if不是x,因为None对于if语句是一个“falsey”值。但是最好只有这样做,如果你想要以相同的方式来处理所有falsey值(零值数值类型,空集合和无)。如果你正在处理的值是一些可能的其他值或无表示“无值”(例如,当一个函数返回None失败),那么更好的使用如果x是无,这样你不会意外地假定函数失败,当它刚刚发生返回一个空列表,或数字0。

我使用==而不是为不可变的值类型的参数建议你应该使用如果x ==无,而不是如果x是无。但是,在无Python的情况下,显式保证在整个Universe中只有一个None,而正常的惯用Python代码使用的是。

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

对于像get_attr这样的例子,我希望它引发异常,因为我要像do_something_with(get_attr(file))一样调用它。调用者的正常期望是,他们将获得属性值,并让他们获得无,并假设属性值是一个更大的危险,比忘记处理异常,当你可以实际继续,如果属性不能被发现。此外,返回None以指示失败意味着None不是该属性的有效值。这在某些情况下可能是一个问题。

对于像see_if_matching_file_exists这样的虚函数,我们提供了一个模式,它检查几个地方,看看是否有匹配,如果找到一个匹配可以返回一个匹配,如果没有匹配,则返回None。但也可以返回一个匹配列表;那么没有匹配只是空列表(这也是“falsey”;这是其中一种情况,我只是使用如果x看看是否有什么回来)。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值