函数内的Python for循环不返回值
我编写了这个相当简单的Python函数,但由于某种原因,在for循环结束后,函数中不会返回任何内容,也无法打印出来。我可以很好地调用该函数,并在for循环中调用prints,以确保值正确无误。我是不是漏掉了什么明显的东西?底部的print语句不打印任何内容函数内的Python for循环不返回值,python,for-loop,Python,For Loop,我编写了这个相当简单的Python函数,但由于某种原因,在for循环结束后,函数中不会返回任何内容,也无法打印出来。我可以很好地调用该函数,并在for循环中调用prints,以确保值正确无误。我是不是漏掉了什么明显的东西?底部的print语句不打印任何内容 def evaluate_arima_model(X, arima_order, s_arima_order): scores = [] train_steps = [36, 48, 60, 72, 84] for i
def evaluate_arima_model(X, arima_order, s_arima_order):
scores = []
train_steps = [36, 48, 60, 72, 84]
for i in train_steps:
Train = X[0:i]
Test = X[i:i + 12]
model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
model_fit = model.fit(trend='nc', disp=0)
yhat = model_fit.forecast(12)
rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
scores.append(rmse)
print(scores)
return scores
这是函数的调用方式(由另一个具有嵌套循环的函数调用)
def evaluate_models(dataset, p_values, d_values, q_values, sp_values, sd_values, sq_values, s_values):
dataset = dataset.astype('float32')
best_score, best_cfg, best_cfg2 = float("inf"), None, None
for p in p_values:
for d in d_values:
for q in q_values:
order = (p,d,q)
for sp in sp_values:
for sd in sd_values:
for sq in sq_values:
for s in s_values:
sorder = (sp,sd,sq,s)
try:
rmse = evaluate_arima_model(dataset, order, sorder)
if rmse < best_score:
best_score, best_cfg, best_cfg2 = rmse, order, sorder
print('ARIMA%s SARIMA%s RMSE=%.3f' % (order,sorder,rmse))
except:
continue
print('\n','Best ARIMA%s SARIMA%s RMSE=%.3f' % (best_cfg, best_cfg2, best_score))
series = read_csv('dataset.csv', header=None, index_col=0, parse_dates=True, squeeze=True)
series = numpy.log(series)
# Evaluate parameters
p_values = range(0, 2)
d_values = range(0, 2)
q_values = range(0, 2)
# Evaluate seasonal parameters
sp_values = range(0, 2)
sd_values = range(0, 2)
sq_values = range(0, 2)
#Set seasonality
s_values = [12]
#Call grid loop
evaluate_models(series, p_values, d_values, q_values, sp_values, sd_values, sq_values, s_values)
您的print()
语句必须打印某些内容。但是,由于您没有return
语句,因此您的函数不会返回任何内容(它返回None
)。如果您希望函数返回某些内容,请添加最后一行:
return scores
调试尝试: 简化代码:
In [1]: def evaluate_arima_model(X, arima_order, s_arima_order):
...: scores = []
...: train_steps = [36, 48, 60, 72, 84]
...: for i in train_steps:
...: rmse = None
...: scores.append(rmse)
...: print(scores)
...: return scores
...:
...:
In [2]: evaluate_arima_model(1,1,1)
[None, None, None, None, None]
Out[2]: [None, None, None, None, None]
我看不出这样做不起作用的原因。您需要编写返回语句,而不是打印
def evaluate_arima_model(X, arima_order, s_arima_order):
scores = []
train_steps = [36, 48, 60, 72, 84]
for i in train_steps:
Train = X[0:i]
Test = X[i:i + 12]
model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
model_fit = model.fit(trend='nc', disp=0)
yhat = model_fit.forecast(12)
rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
scores.append(rmse)
return(scores)
最终解决了这个问题,问题是返回一个列表还是一个标量,这正是我所需要的。所以“返回分数[0]”解决了这个问题
def evaluate_arima_model(X, arima_order, s_arima_order):
scores = []
train_steps = [36]
for i in train_steps:
Train = X[0:i]
Test = X[i:i + 12]
model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
model_fit = model.fit(trend='nc', disp=0)
yhat = model_fit.forecast(12)
rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
scores.append(rmse)
return scores[0]
它是否不打印任何内容或
[]
?打印不会返回。您的意思是您已经分配了函数的结果,并且它是无的
?因此,因为我们无法复制它。您所做的不同打印显示了什么?即“我可以很好地调用该函数,并在for循环中调用prints,以确保值正确无误。“没有任何东西打印出来。添加一个返回值仍然不会使它返回任何令人悲伤的东西。我希望打印即使没有返回也能运行,是吗?它至少应该打印分数,即使没有返回语句,因为print(分数)
@WaleedIqbal是的,它应该。我不明白它为什么不打印。它必须打印!是的,这是我没有得到的。我希望打印可以运行。添加退货没有帮助anyway@bhat557请参阅“我的编辑”。它绝不会不起作用。很可能您发布的代码与您正在运行的代码不同。@bhat557我没有idea为什么它以前不起作用,但我强烈怀疑您发布的示例与实际代码不一样,因为您的示例不起作用没有逻辑原因。python中没有println
。@WaleedIqbal edited实际上我使用了更多的Scala语法,非常抱歉输入错误。
def evaluate_arima_model(X, arima_order, s_arima_order):
scores = []
train_steps = [36]
for i in train_steps:
Train = X[0:i]
Test = X[i:i + 12]
model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
model_fit = model.fit(trend='nc', disp=0)
yhat = model_fit.forecast(12)
rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
scores.append(rmse)
return scores[0]