函数内的Python for循环不返回值

函数内的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

我编写了这个相当简单的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 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]