2017-04-26 49 views
1

沒有將sympy符號傳遞給函數有什麼缺點嗎?我應該將sympy符號傳遞給函數嗎?

def compute(alpha,a): #or def compute(a) 
    return 3*alpha+a 

alpha = sympy.symbols("alpha") 
expr = compute(alpha,3) 

我沒有通過alphacompute()(我假設,因爲它是一個全局變量),而現在,我認爲它使代碼更可讀,當我離開它。 這是否被認爲是不好的設計?我想這是一個通用的「如何處理Python中的全局變量」問題,正如已經被問到here,但答案表示它將取決於具體的用例。

我還有我之前調用該函數來創建alpha符號,如果我不包括它,它只是並不明顯。

+2

除非有一些不合理的理由,否則將變量作爲參數傳遞給函數,而不是將其讀入全局。它使得代碼更清晰,更健壯。 – khelwood

回答

2

相反列表(其中其它問題是關於),SymPy treats symbols (and expressions) as immutable。此外,它們由您傳遞給Symbolsymbols的字符串唯一標識。爲了說明考慮以下幾點:

from sympy import Symbol 
print({Symbol("a"), Symbol("a")}) 
>>> {a} 

因此宣告SymPy符號作爲一個全局變量不會造成這麼大的問題 - 它像全局定義一些數學常數。例如,它不能發生,使用該標誌的一些合理的代碼更改it.¹

所以,根據上下文,它可以是有意義的:

  1. 定義alpha全球,
  2. alpha作爲參數的功能,
  3. 限定alpha在每個呼叫的功能內(這是可能的,因爲符號僅依賴於相關聯的字符串)。

沒有進一步的情況下,這是不可能的說,它適用於您的情況。


¹需要注意的是不合理的代碼仍然可以做到這一點,例如:

from sympy.abc import a 
from sympy.abc import a as a_2 
a.name = "b" 
print(a_2) 
>>> b 
1

在文件的頂部定義常用符號(即全球)是非常好的做法。正如其他人指出的那樣,即使它再次被定義,它也並不重要,因爲兩個同名的符號被認爲是相同的。 這裏有一個重要的警告:如果你使用假設,如real=True,那麼這很重要。所以你應該避免使用兩個具有相同名稱但不同假設的符號。

在你的例子中,如果alpha始終應該是符號Symbol('alpha'),那麼對一個永不改變的函數有一個參數是沒有意義的。


另一種方式,你可以做的事情,順便說一句,是不具備的功能在所有的,只是使用的表達與符號變量

alpha, a = symbols('alpha a') 
expr = 3*alpha + a 

,然後當你要使用潛艇替代值

expr.subs({a: 3}) # or expr.subs(a, 3) 
相關問題