2017-05-12 43 views
0

我創建了一套叫對方價格選擇功能。其中一個功能運行了很長時間才能優化一些參數(使用Nelder Mead)。在這個函數中,計算一個值,我想在其他一些函數中使用它,但我不想通過return語句傳遞它。我認爲使用全局變量將是完美的。如何從函數中傳遞值而不使用return?

現在,怪異的一部分:當我打開我通過import *寫程序包的功能,我無法訪問全局變量的一個函數創建。如果我帶腳本使用函數定義,運行它以在我的Python控制檯中定義函數,然後調用這些函數,那麼全局變量構造可以正常工作。可能是什麼問題,爲什麼我加載/定義函數作爲一個包還是「手動」定義會有所作爲?

作爲包加載時

錯誤:NameError: name 'h_out' is not defined

global h_out 
h_out=None 
import hngoption 

prices = timeseries[data.Date[i]:].head(30) 
output = hngoption.params(prices) 

params() calls function LogLike() as part of its computations which contains: 

def LogLike(B, r): 
     # (...) 
     for i in range(N - 3, -1, -1): 
      h[i] = B[0] + B[2] * h[i + 1] + B[1] * pow(Z[i + 1] - B[3] * sqrt(h[i + 1]), 2) 
      Z[i] = (ret[i] - r - B[4] * h[i])/(h[i] ** 0.5) 
      L[i] = -log(h[i]+ 0.000000000000001) - (ret[i] ** 2)/h[i] 

     LogL = VecSum(L) 

     global h_out  #IMPORTANT PART 
     h_out = h[0] 

     if ((B[0] < 0) | (B[1] < 0) | (B[2] < 0) | (B[3] < 0) | (B[4] < 0)): # (B[2]+B[1]*pow(B[3],2)>=1)) 

      return 1e50 
     else: 
      return -LogL # Minimize -Log-Like(Beta) 

全LogLike功能:

def LogLike(B, r): 

    N = len(timeseries) #timeseries is a global var 
    # Calculate S&P500 returns 
    ret = [0.0] * (N - 1) 
    for i in range(0, N - 1): 
     ret[i] = (log(timeseries.ix[i]/timeseries.ix[i + 1])) 

    Variance = VecVar(ret) 
    h = [0 * i for i in range(N - 1)] 
    Z = [0 * i for i in range(N - 1)] 
    L = [0 * i for i in range(N - 1)] 

    # Construct GARCH(1,1) process by working back in time 
    h[N - 2] = Variance 
    Z[N - 2] = (ret[N - 2] - r - B[4] * h[N - 2])/h[N - 2] ** 0.5 
    L[N - 2] = -log(h[N - 2]) - (ret[N - 2] ** 2)/h[N - 2] 

    for i in range(N - 3, -1, -1): 
     h[i] = B[0] + B[2] * h[i + 1] + B[1] * pow(Z[i + 1] - B[3] * sqrt(h[i + 1]), 2) 
     Z[i] = (ret[i] - r - B[4] * h[i])/(h[i] ** 0.5) 
     L[i] = -log(h[i]+ 0.000000000000001) - (ret[i] ** 2)/h[i] 

    LogL = VecSum(L) 

    global h_out  #IMPORTANT PART 
    h_out = h[0] 


    if ((B[0] < 0) | (B[1] < 0) | (B[2] < 0) | (B[3] < 0) | (B[4] < 0)): # (B[2]+B[1]*pow(B[3],2)>=1)) 

     return 1e50 
    else: 
     return -LogL # Minimize -Log-Like(Beta) 
+6

請不要截圖給代碼。相反,將代碼發佈在問題本身中,最好是構成[mcve]的代碼。 –

+4

你也應該解釋爲什麼你不想用回,因爲這是從一個函數返回的數據明顯的方式。 –

+0

主要是因爲NelderMead調用這個函數並傳遞另一種說法了回報,將極大的相互調用的函數鏈複雜化。 – SW7

回答

0

您可以使用以下類型的,將攜帶結果的參數。

def test(a): 
    a[0]=a[0]+2 

>>> a = [2] 
>>> test(a) 
>>> a 
[4] 
0

from somemodule import *結合在somemodule存在在那個時候類似命名當前模塊中的變量的全局變量。尚未創建的變量不會被導入。如果另一個模塊中的變量被重新分配,當前模塊現在有自己的引用,這些對象不受影響。

要解決您的問題,請在全局範圍內爲h_out指定一些默認值,以便其他模塊在函數完成之前引用它時不會收到錯誤。並通過模塊訪問變量以獲取共享值而不是通配符導入。

somemodule.py

h_out = None 

def LogLikeDeep(B, r): 
    global h_out  #IMPORTANT PART 
    h_out = h[0] 

使用

>>> import somemodule 
>>> somemodule.h_out 
>>> print(repr(somemodule.h_out)) 
None 
>>> somemodule.LogLikeDeep('foo', 'bar') 
>>> print(repr(somemodule.h_out)) 
'foo' 
+0

全球h_out h_out =無 高清LogLike(B,R): 全球h_out h_out = H [0] (...) – SW7

+0

謝謝你,我實現了這一點,但如果我說hngoption.h_out它返回空,而比價值。代碼: 全球h_out h_out =無 高清LogLike(B,R): 全球h_out h_out = H [0] (...) – SW7

+0

...和功能已經叫什麼名字?如何用一個工作示例更新您的問題,然後我們可以看到發生了什麼。 – tdelaney

相關問題