将操纵变量从一个函数传递到另一个函数中

2024-09-29 18:49:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用暴力策略来寻找解决问题的答案。其思想是以10为增量在3个不同的范围内循环,例如嵌套循环,以显著减少组合的数量

然后取第一个函数中给出的三个解,为函数重新定义循环范围参数,从而得到更精确的解

这是我的代码:

# first broad looping function to zone down to the relevant area of my solution
def t1_solve(cgoal):
    max_value = None
    nc_f = None
    c_f = None
    cd_f = None
    for i, j, k in [(i,j,k) for i in range(nc_rev.idxmax(),int((cgoal*100)+200),5) for 
    j in range(c_rev.idxmax(),int((cgoal*100)+200),5) for k in range(cd_rev.idxmax(),
    int((cgoal*100)+200),5)]:
        if (t1rev(i,j,k) > max_value and t1c(i,j,k) > cgoal):

            #storing the optimal value result, and my three solution in nc_f, c_f, cd_f

            max_value = t1rev(i,j,k)
            nc_f = i
            c_f = j
            cd_f = k

    print max_value
    print nc_f, c_f, cd_f
    return nc_f
    return c_f
    return cd_f

# second reduced looping problem to fine-tune my answer

def t1_finetune():

# run the broad looping function

    t1_solve(3.61)

# this is where I have trouble with passing my solutions stored in the
# previous function's nc_f, c_f, cd_f

#ERROR OCCURS HERE!!!!!
    if nc_f - 20 > 0:
        nc_lowerbound = nc_f - 20
    else:
        nc_lowerbound = 1

    if nc_f + 20 < 1499:
        nc_upperbound = nc_f + 20
    else:
        nc_upperbound = 1499

    if c_f - 20 > 0:
        c_lowerbound = c_f - 20
    else:
        c_lowerbound = 1

    if c_f + 20 < 1499:
        c_upperbound = c_f + 20
    else:
        c_upperbound = 1499

    if cd_f - 20 > 0:
        cd_lowerbound = cd_f - 20
    else:
        cd_lowerbound = 1

    if cd_f + 20 < 1499:
        cd_upperbound = cd_f + 20
    else:
        cd_upperbound = 1499    

    for i, j, k in [(i,j,k) for i in range(nc_lowerbound, nc_upperbound) for 
    j in range(c_lowerbound, c_upperbound) for k in range(cd_lowerbound, cd_upperbound)]:
        if (t1rev(i,j,k) > max_value and t1c(i,j,k) > cgoal):
            max_value = t1rev(i,j,k)
            nc_f = i
            c_f = j
            cd_f = k
    print max_value
    print nc_f, c_f, cd_f
    return nc_f, c_f, cd_f


t=time.time()
t1_finetune()
print time.time() - t

我收到的错误消息是:

UnboundLocalError: local variable 'nc_f' referenced before assignment

本质上,我只需要将nc_f、c_f和cd_f从我的t1_solve()传递到我的t1_finetune()。单独运行t1_solve()可以正常工作,当在t1_finetune()中调用它时,它仍然可以正常工作,直到它继续运行到代码的其余部分,在那里我对错误发生进行了注释

我希望这是明确的,请让我知道,如果有什么我可以澄清

提前谢谢


Tags: theinforifvaluecdrangeelse
1条回答
网友
1楼 · 发布于 2024-09-29 18:49:27

首先,您的t1_solve函数有三个return语句,而不是一个。一旦到达第一个,函数就结束了,其他函数就永远不会发生。所以,你需要这个:

return nc_f, c_f, cd_f

接下来,当您调用t1_solve并将这些值返回给您时,您只需忽略结果。你需要把它们存放在某个地方。例如:

nc_f, c_f, cd_f = t1_solve(3.61)

为了直观地理解,这里要做的是返回三个值而不是一个,并将这三个返回值分配给三个变量

如果您想知道实际发生了什么:第一个nc_f, c_f, cd_f创建一个3元素元组并返回该元组。然后,后面的nc_f, c_f, cd_f =使用iterable赋值解包。请参阅教程第Tuples and Sequences节,以了解详细的介绍

相关问题 更多 >

    热门问题