首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Python需要丰富的比较?

为什么Python需要丰富的比较?
EN

Stack Overflow用户
提问于 2014-01-08 15:46:39
回答 2查看 1.6K关注 0票数 16

有一段时间我有一个困惑:有没有一个场景我们确实需要在Python中使用丰富的比较?

我读过官方文档here,但它只说明了它是如何工作的,而不是我们为什么需要它。

文档的一个片段:

x==y的真假并不意味着x!=y就是假的。可以描述一个我们需要丰富对比的场景。在这个场景中,我们可以让__eq____ne__都返回False,以禁用比较或任何其他目的。(我们可以使用__cmp__来实现这一点)

但这只是一个猜测,我还没有在真正的项目中遇到过这样的需求。

有没有人真的需要使用丰富的比较,或者在理论上有任何其他场景我们需要使用丰富的比较?

也许我的x==yx!=y的例子引起了一些混淆,很抱歉。让我说得更清楚一点:

有没有什么情况下,丰富的比较可以帮助,但__cmp__不能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 16:07:45

NumPy使用丰富的比较来向量化==!=<等,就像它对大多数其他运算符所做的那样。例如,

代码语言:javascript
复制
>>> x = numpy.array([1, 2, 3, 4, 5])
>>> y = numpy.array([2, 2, 1, 4, 4])
>>> x == y
array([False,  True, False,  True, False], dtype=bool)

当将数组xy与任何比较运算符进行比较时,NumPy将按元素应用运算符,并返回一个结果数组。例如,在将操作应用于符合条件的x单元格时,这很有用:

代码语言:javascript
复制
>>> x[x==y] = 6
>>> x
array([1, 6, 3, 6, 5])

在这里,我选择了与y的相应元素相等的x的所有元素,并将它们设置为6。

票数 8
EN

Stack Overflow用户

发布于 2014-01-08 16:06:53

您甚至不需要返回布尔值。文档的要点是,您可以完全自由地控制重载方法可以返回的内容;Python并不强制要求__eq____ne__返回一致的布尔值。

SQLAlchemy project完全重载了丰富的比较运算符以返回完全不同的内容。如果您使用:

代码语言:javascript
复制
model1.column == model2.column

代码语言:javascript
复制
model1.column != model2.column

代码语言:javascript
复制
model1.column < model2.column

其中model1model2都是SQL表模型,那么您得到的不是布尔值,而是SQLAlchemy查询过滤器。

您可以使用返回值构造SQL查询:

代码语言:javascript
复制
model1.filter(model1.column <= model2.column)

将导致SQL查询,如下所示:

代码语言:javascript
复制
select model1.*
from model1
left join model2 on model1.foreign_key == model2.primary_key
where
    model1.column <= model2.column

完全在Python代码中,使用Python丰富的比较语法。

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

https://stackoverflow.com/questions/20989750

复制
相关文章

相似问题

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