我創建了一套叫對方價格選擇功能。其中一個功能運行了很長時間才能優化一些參數(使用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)
請不要截圖給代碼。相反,將代碼發佈在問題本身中,最好是構成[mcve]的代碼。 –
你也應該解釋爲什麼你不想用回,因爲這是從一個函數返回的數據明顯的方式。 –
主要是因爲NelderMead調用這個函數並傳遞另一種說法了回報,將極大的相互調用的函數鏈複雜化。 – SW7