Python 2.x 允许比较异构类型。
一个有用的快捷方式(此处为 Python 2.7)是None
比较小于任何整数或浮点值:
>>> None < float('-inf') < -sys.maxint * 2l < -sys.maxint
True
在 Python 2.7 中,一个空元组()
是一个无限值:
>>> () > float('inf') > sys.maxint
True
当您可能对整数和浮点数的混合列表进行排序并希望有一个绝对最小值和最大值可供参考时,此快捷方式很有用。
但是,此快捷方式已在 Python 3000 中删除(这是 Python 3.2):
>>> None < 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < int()
此外,Python3000已经取消 sys.maxint
了所有 int 都提升为 long 并且限制不再适用的理论。
PEP 326 , A Case for Top and Bottom Values, 在 Python 中提高了参考最小值和最大值。记录了新的排序行为。
由于 PEP 326 被拒绝,对于 Python 2X 和 Python 3000 上的整数、浮点数和长整数工作的最小值和最大值,有哪些有用、可用的定义?
编辑
有几个答案类似于“只使用 maxv=float('inf')”......我在想的原因,无论可能性多么遥远,是这样的:
>>> float(2**5000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to float
和:
>>> cmp(1.0**4999,10.0**5000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
然而:
>>> () > 2**5000
True
为了将 cmp 转换为浮点值,float('inf')
需要将 long 值转换为浮点数,并且转换会导致OverflowError
...
结论
谢谢大家的回答和评论。我选择了 TryPyPy 的答案,因为它似乎最符合我的要求:绝对最大和绝对最小值,如 Wikipedia entry on infinity 中所述。
通过这个问题,我了解到 long 或 int 值不会转换为 float 以完成float('inf') > 2**5000
. 我不知道。