在我看来,像float('nan')
这样的东西应该得到优化,但显然它们不是用Python实现的
>>> NaN = float('nan')
>>> a = [ 1, 2, 3, NaN ]
>>> NaN in a
True
>>> float('nan') in a
False
它对不像其他事情一样优化nan
有什么意义吗?
在我看来,nan
只是nan
除此之外,当你在这些东西上使用sorted
时,它们会给出奇怪的结果:
>>> sorted([3, nan, 4, 2, nan, 1])
[3, nan, 1, 2, 4, nan]
>>> 3 > float('nan')
False
>>> 3 < float('nan')
False
对nan
的比较是这样定义的,但在我看来它并不是“pythonic”。为什么它不会引起错误
会员资格测试
float('nan')
的两个不同实例彼此不相等。它们“不是一个数字”,所以它们也不必相等是有道理的。它们是非数字对象的不同实例:如文件所述here:
有一个身份检查!这就是你在问题中看到这种行为的原因,也是
NaN in a
返回True
而float('nan') in a
不返回的原因Python中的排序
Python将Timsort算法用于其
sorted()
函数。(另请参阅this了解文本解释。)我不打算讨论这个问题。我只想演示一个简单的示例:这是我的班级。它将成为我们的
float('nan')
对象。它的作用类似于float('nan')
,因为它为所有比较操作返回False
:当我们使用
sorted()
函数(或list
的.sort()
方法)而不使用reverse=True
参数时,我们要求按升序对iterable进行排序。为此,Python尝试依次调用__lt__
方法,从列表中的第二个对象开始,查看它是否小于前一个对象,依此类推:输出:
现在,切换回您的示例:
输出:
A(1).__lt__(3)
将返回False
。这意味着A(1)
不小于 大于3或这意味着3
相对于A(1)
处于正确位置李>int.__lt__(4, A(1))
,因为它返回NotImplemented
对象,Python检查A(1)
是否有 已实现__gt__
并且是,因此A(1).__gt__(4)
将返回False
,这意味着A(1)
对象位于正确的位置 相对于4
李>这就是为什么
<>最好检查Timsort算法并考虑这些点。如果我仔细阅读Timsort算法,我会包括剩下的步骤sorted()
的结果看起来很奇怪,但却是可以预测的A(1)
对象在这两种情况下,我的意思是当int
类返回NotImplemented
并且当__lt__
从A(1)
调用时,将返回False相关问题 更多 >
编程相关推荐