如果是else语句,则未定义全局名称

时间:2017-03-08 10:49:52

标签: python if-statement global-variables

def vel(y,umax,r,Rmax):
     vel_p=umax*(1-(r/Rmax)**2)

     if r<50:
        r=50-y
     else:
        r=y-50
     return 'the value of velocity in cell is %r,%r,%r,%r'%(umax,r,Rmax,vel_p)


def main ():

     y=(input('enter y'))   
     a=(input('enter the umax'))
     #b=(input('enter the r'))
     b=(r)
     c=(input('enter the Rmax'))
     print(vel(a,c,b,y))

main()

我不明白我应该把它放在哪里r它给我一个错误的全局变量r未定义

2 个答案:

答案 0 :(得分:0)

正如评论中已经提到的那样,尝试使用&#34; good&#34; (=可读)变量名称,因为这有助于减少混淆。

对于使用try ... except的非数字输入,应该使从字符串到float的转换变得健壮,所以我把它放在一个单独的函数中。

通常,您不希望函数返回插入了所有计算值的字符串,但是&#34; raw&#34;值。这些值的打印通常应该在其他地方完成。

在评论中你提到你&#34;需要从y得到r的值,如果我没有把它放在注释中它取我的r值并且不会从if r语句计算出来#34; ,但是你的函数vel()使用r来计算第一行中的vel_p。变量r是函数的参数,因此它必须来自某个地方。您可以让用户像所有其他值一样输入它,或者您必须在其他地方定义它。如果你在全球范围内这样做,请看看Vipin Chaudharys的答案。

我的建议,如果你想让用户输入r:

def vel(y, u_max, r, r_max):
    # You use the value of r here already!
    vel_p=u_max*(1-(r/r_max)**2)

    # Here you change r, if r is less than 50.
    # You are using r again, before assigning a new value!
    if r<50:
        r=50-y
    else:
        r=y-50

    # I use the preferred .format() function with explicit field names
    # \ is used to do a line-break for readability
    return 'The value of velocity in cell is umax: {value_u_max}, \
r: {value_r}, Rmax: {value_r_max}, vel_p: {value_vel_p}.'.format(
    value_u_max=u_max, value_r=r,value_r_max=r_max, value_vel_p=vel_p)

# Helper function to sanitize user input    
def numberinput(text='? '):
    while True:
        try:
            number=float(input(text))
            # return breaks the loop
            return number
        except ValueError:
            print('Input error. Please enter a number!')


def main():
    y=numberinput('Enter y: ')
    u_max=numberinput('Enter the umax: ')
    r=numberinput('Enter the r: ')
    r_max=numberinput('Enter the Rmax: ')
    print(vel(y, u_max, r, r_max))

main()

注意,r的输入值用于进行计算。然后根据y更改它,并打印新值。

答案 1 :(得分:-1)

在您的方法中,您指定了b = (r),而您从未指定过什么是r,所以如果您的全局范围内有变量r,那么第一行就是主要方法应该是

def main():
   global r
   # Now you can use your r

通过这样做,您在方法中调用了变量r

希望有所帮助:)