2016-07-25 137 views
2

我希望所有涉及一个或多个None变量的数学运算都返回None。如何将所有涉及None的python操作转换为None值?

例子:

a = None 
b = 7 
a*b 

我想这最后一行返回无,但它不是给我一个错误:

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

我明白为什么这个错误存在,所有这一切,但有任何方式强迫结果只是一个None

背景:我有几个函数可以挖掘数据并返回一个值,名为diff。稍后,我将diff乘以或添加到几件事情上以获取有意义的信息,但并非我所有的原始数据都包含有用的diff,因此在这些情况下我将它设置为返回diff = None。当我绘制结果时,我希望能够跳过这些点。当我绘图时,Python似乎没有任何问题跳过数组中的None元素,所以我只想让操作的结果为None

+3

使用浮动( “南”),而不是'None' – donkopotamus

+1

(HTTP [如何链属性查找可能返回无?]://计算器。COM/Q/15280511); [也许是一种“monad in python”](http://stackoverflow.com/q/8507200), –

+0

类似于@donkopotamus,你可以使用十进制模块和'decimal.Decimal('NaN')'作为'None' 。如果你想正确舍入十进制算术,这可能会更好。如果您的所有操作都使用“十进制”数字,它将以您想要的方式工作。 – tdelaney

回答

2

,而不是试图迫使包含一些其他任意值的所有数学运算可以返回任意其它值,你可以简单地使用NaN,这是专为正是这种目的:

>>> nan = float("NaN") 
>>> 7 * nan 
nan 
>>> 7 + nan 
nan 

一个nan将正确的整个数学运算级联。

一个好的绘图库也会理解nan并在绘图时忽略它们。但是,如果没有,只需在绘图之前立即将NaN更换为None即可。

+0

正是我想要的。谢谢。 – barriboy

0

可以在参数检查的None存在,然后返回初:

def calc(*args, **kwargs): 
    if None in list(args) + list(kwargs.keys()): 
     return None 
    #rest 

你也可以写一个装饰和包装现有的功能,如果你想将这个操作适用于本会更有用许多现有的功能(甚至只是一个,为清楚起见):

def return_none_for_none(f): 
    def wrapped(*args, **kwargs): 
     return None if None in list(args) + list(kwargs.keys()) else f(*args, **kwargs) 
    return wrapped 


@return_none_for_none 
def some_math_exp(a, b, c=2): 
    return a + b*c 
+1

为什么不简单地使用'如果args中没有None或者kwargs中没有'两个成员检查,而不是从每个列表中创建一个列表,然后将它们组合到第三个列表中? – TigerhawkT3

+0

为什么要检查'kwargs'中的'None'是**键**? – donkopotamus

0

没有太多的上下文给你的代码结构;我假设你只是想尝试一个操作,如果不可能,就返回None。

也许一个try /除了能在这里工作:

try: 
    # operation here 
except TypeError: 
    return None 

不过,我使用NaN浮点值@donkopotamus同意完成你在寻找什么。如果您尝试评估的表达式包含NaN,则整个表达式将计算为NaN。如果找到NaN,则可以始终返回None,或者在将数据传递到数学库时转换数据。

>>> nan = float('NaN') 
>>> nan + 15 ** 4 
nan 
>>> 1000 - nan /6%3 
nan 
>>> 
+0

作为一个迂腐的人,“nan”并不总是会导致父母表达评价为“nan”。考虑'1 ** nan'或'nan ** 1'。所有这些级联规则都被别人仔细考虑过了,我们不需要再次猜测;-) – donkopotamus

相关问题