2016-07-25 134 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

相關問題