【发布时间】:2012-05-14 01:16:08
【问题描述】:
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 has removed sys.maxint 的理论是所有整数都提升为长整数并且限制不再适用。
PEP 326,顶部和底部值的案例,在 Python 中高级参考最小值和最大值。新的排序行为documented。
由于 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...
结论
感谢大家的回答和cmets。我选择了 TryPyPy 的 answer,因为它似乎最符合我的要求:维基百科中描述的绝对最大和绝对最小值 entry on infinity.
通过这个问题,我了解到long或int值不会转换为float才能完成float('inf') > 2**5000的比较。我不知道。
【问题讨论】:
-
float("inf")有什么问题,或者,如果您需要号码,sys.float_info.max? -
IIRC 异质值按其类型名称的字母顺序排列 - 几乎没有用处
-
“Python3000 已经删除了 sys.maxint,因为理论上所有的 int 都提升为 long,并且限制不再适用。”,不,Python3000 已经删除了
intperiod。现在所有整数都是long,这就是它被重命名的原因。 -
"为了将 cmp 转换为浮点值,float('inf'),需要将 long 值转换为浮点数。"不,这不是 float 到 long(或 float 到 int)比较的工作方式。 (它不能那样工作,从那时起你将失去平等的传递性,对 dict 和 set 包含产生各种可怕的后果。)将
float('inf')与 10**1000 进行比较不应引发 OverflowError。 -
@carrot-top 正如 Pyson 所说,你目前对 float('inf') 的观点并不好。现在,Mark Dickinson 是 CPython 核心和库中所有数字的当前维护者。如果他也说 float('inf') 还可以,我就不会费心寻找更多反例了。
标签: python python-3.x