我正在寻找一个“占位符”值,它具有 None 的特征,但在出现在数学语句中时不会抛出“TypeError”。例如,考虑 None 的以下用法:
>> x = None
>> x**2
TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'int'
我想要的是一个替代的占位符值'让我们称之为'mathNone',它在数学运算和函数下是不变的。例如:
>> x = mathNone
>> x**2
mathNone
或者更一般地说:
>> some_arbitrary_math_function(mathNone)
mathNone
有这样的东西吗?反正有没有我自己写的?
该应用程序用于非因果方程求解器。即一个 m 方程和 m+n 变量的系统,其中可以分配任何 n 变量,其余的 m 变量保留为一些占位符并解决。我可以使用任何数字作为占位符,但我想保证永远不会出现 ZeroDivisionErrors 或 ValueErrors。
请您参考如下方法:
您可能正在寻找 NaN (“不是数字”)。 NaN 是 IEEE 754 float 中的一个特殊值,仅用于您描述的那种场景。 NaN 上的算术按照您的要求运行:
>>> nan = float('nan')
>>> nan
nan
>>> nan ** 2
nan
>>> nan + 2
nan
# etc
然而,在某些情况下,NaN 的表现令人惊讶,以至于它可能比它的值(value)更麻烦。它最麻烦的特征是所有涉及 NaN 的比较都是错误的:它不是人们对 ℝ 所期望的总顺序的一部分:
>>> [ nan > 0, nan < 0, nan == 0 ]
[False, False, False]
事实上,它甚至不等于自己...
>>> nan == nan
False
(要测试一个值是否为 NaN,请使用 math.isnan。)它也不会完全避免错误,例如
>>> nan / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero
(最后这可能意味着 Python 不完全符合 IEEE754,但基本上没有完全符合 IEEE754,所以。)
最后说明:float('nan') 是在 Python 3.4 及更高版本中创建 NaN 值的最简单方法。标准库添加了一个常量 math.nan在 Python 3.5 中。在需要在多个 Python 版本上运行的代码中,我会这样做:
import math
try:
nan = math.nan
except AttributeError:
nan = float('nan')
