Skip to main content
 首页 » 编程设计

Python:是否有数学占位符NoneType

2025年05月04日30JeffreyZhao

我正在寻找一个“占位符”值,它具有 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')