首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“和”和“或”如何使用非布尔值?

“和”和“或”如何使用非布尔值?
EN

Stack Overflow用户
提问于 2017-10-30 03:16:45
回答 7查看 20.3K关注 0票数 132

我正在努力学习python,并遇到了一些代码,这些代码非常简短,但完全没有意义。

背景是:

代码语言:javascript
运行
复制
def fn(*args):
    return len(args) and max(args)-min(args)

我知道它在做什么,但是python为什么要这样做--即返回值而不是True/False?

代码语言:javascript
运行
复制
10 and 7-2

返回5.类似地,将and更改为或将导致功能更改。所以

代码语言:javascript
运行
复制
10 or 7 - 2

还会有10块。

这是合法的/可靠的风格,还是有什么问题吗?

EN

回答 7

Stack Overflow用户

发布于 2017-10-30 03:23:42

引用Python文档

注意,andor 都没有限制值和类型的--它们返回到FalseTrue,而是返回E 112最后评估的参数E 213。这有时很有用,例如,如果s是一个字符串,如果该字符串为空,则应由默认值替换,则表达式s or 'foo'将生成所需的值。

因此,Python就是这样设计来计算布尔表达式的,上面的文档让我们了解了为什么会这样做。

要得到一个布尔值,只需键入它。

代码语言:javascript
运行
复制
return bool(len(args) and max(args)-min(args))

为什么?

短路。

例如:

代码语言:javascript
运行
复制
2 and 3 # Returns 3 because 2 is Truthy so it has to check 3 too
0 and 3 # Returns 0 because 0 is Falsey and there's no need to check 3 at all

or也是如此,也就是说,一旦找到它,它就会返回Truthy的表达式,因为评估表达式的其余部分是多余的。

Python没有返回硬核TrueFalse,而是返回Truthy或Falsey,它们无论如何都要评估为TrueFalse。您可以按原样使用该表达式,它仍将工作。

要知道Truthy和Falsey是什么,请查看帕特里克·霍的回答

票数 21
EN

Stack Overflow用户

发布于 2017-10-30 03:33:45

执行布尔逻辑,但它们在比较时返回一个实际值。当使用时,从左到右在布尔上下文中计算值。0、'‘、[]、()、{}、None在布尔上下文中都是假的;其他一切都是真的。

如果布尔上下文中的所有值都为真,则将返回最后一个值。

代码语言:javascript
运行
复制
>>> 2 and 5
5
>>> 2 and 5 and 10
10

如果任何值在布尔上下文中为false,则返回第一个false值。

代码语言:javascript
运行
复制
>>> '' and 5
''
>>> 2 and 0 and 5
0

所以密码

代码语言:javascript
运行
复制
return len(args) and max(args)-min(args)

当有max(args)-min(args) args时,返回的值,否则返回len(args),即0。

票数 8
EN

Stack Overflow用户

发布于 2017-10-30 03:26:57

这是合法的/可靠的风格,还是有什么问题吗?

这是合法的,它是返回最后一个值的短路评价

你提供了一个很好的例子。如果没有传递参数,该函数将返回0,并且代码不必检查没有传递参数的特殊情况。

使用此方法的另一种方法是将任何参数默认为可变原语,如空列表:

代码语言:javascript
运行
复制
def fn(alist=None):
    alist = alist or []
    ....

如果将一些不真实的值传递给alist,则默认为空列表,这是避免if语句和可变的默认参数陷阱的简便方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47007680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档