在Python中,如何从函数对象外部引用函数对象中定义的变量?

时间:2015-01-16 22:31:10

标签: python function variables object

我希望能够获得在latitude()函数对象中定义的变量,如dns_float_a,以便在纬度()之外工作。

我正在使用的代码部分如下。它显示了使用 def()定义的两个变量对象:。然后我想在底部打印方程式,但为了做到这一点,我需要引用函数对象中的变量。

PS这实际上是我写过的第一个程序(它是更长纬度/经度转换程序的一部分)所以请尽量不要假设我非常了解!

提前致谢!

def latitude():
    #LATITUDE
    print "***Degrees/Minutes/Seconds >>> Decimal Degrees***"
    print
    print "Input Latitude"

    dns_a=raw_input("Degrees: ")
    mns_a=raw_input("Minutes: ")
    sns_a=raw_input("Seconds: ")
    ns=raw_input("North (1) or South (2): ")

    dns_float_a=float(dns_a)
    mns_float_a=float(mns_a)
    sns_float_a=float(sns_a)
    ns_float=float(ns)

    #south
    if ns_float==2:
        dns_float_a=dns_float_a*(-1)
        mns_float_a=mns_float_a*(-1)
        sns_float_a=sns_float_a*(-1)
        ns_x="South"

    #north
    elif ns_float==1:
        dns_float_a=dns_float_a*1
        mns_float_a=mns_float_a*1
        sns_float_a=sns_float_a*1
        ns_x="North"

    elif ns_float<1 or ns_float>2 or ns_float>1 and ns_float<2:
        print
        print "*Invalid Input*"
        latitude()

def longitude():
    #LONGITUDE
    print
    print "Input Longitude"

    dns_b=raw_input("Degrees: ")
    mns_b=raw_input("Minutes: ")
    sns_b=raw_input("Seconds: ")
    ns=raw_input("East (1) or West (2): ")

    dns_float_b=float(dns_b)
    mns_float_b=float(mns_b)
    sns_float_b=float(sns_b)
    ns_float=float(ns)

    #south
    if ns_float==2:
        dns_float_b=dns_float_b*(-1)
        mns_float_b=mns_float_b*(-1)
        sns_float_b=sns_float_b*(-1)
        ns_x="South"

    #north
    elif ns_float==1:
        dns_float_b=dns_float_b*1
        mns_float_b=mns_float_b*1
        sns_float_b=sns_float_b*1
        ns_x="North"

    elif ns_float<1 or ns_float>2 or ns_float>1 and ns_float<2:
        print
        print "*Invalid Input*"
        longitude()

latitude()
longitude()

#(d/m/s)ns_float_a
decimal_degrees_latitude=(dns_float_a)+(mns_float_a/60)+(sns_float_a/3600)
#(d/m/s)ns_float_b
decimal_degrees_longitude=(dns_float_b)+(mns_float_b/60)+(sns_float_b/3600)

print
print "Results:"
print
print "Latitude: ", decimal_degrees_latitude
print "Longitude: ", decimal_degrees_longitude
print

3 个答案:

答案 0 :(得分:3)

这是Python内部scope的问题。基本上,您无法访问函数外部函数内定义的变量。

解决此问题的一种方法是从函数中传递您需要的变量作为返回类型。这实际上可以简化您的代码,因为您不需要为每个函数中的所有变量都使用_a和_b。范围规则意味着您可以在两个不同的函数中使用相同名称的变量,并且它们不会相互覆盖。在纬度和经度函数的末尾添加以下行:

return dns_float,mns_float,sns_float

然后将函数调用更改为:

dns_float_a,mns_float_a,sns_float_a = latitude()
dns_float_b,mns_float_b,sns_float_b = latitude()

或者,您可以将纬度和经度计算移动到函数本身中。将每个函数的最后一行更改为:

return dns_float+mns_float/60+sns_float/3600

然后将函数调用更改为:

decimal_degrees_latitude = latitude()
decimal_degrees_longitude = longitude()

答案 1 :(得分:2)

从函数返回值,写到最后:

return dns_float_a, mns_float_a, sns_float_a

并在外面使用:

dns, mns, sns = latitude()

答案 2 :(得分:0)

您已经被告知如何从外部可用的功能内部创建数据。

但是你可以做得更多:因为这两个函数几乎相同,你可以把它们中的大部分组合成一个通用的。

    class InvalidInputError(ValueError): pass

    def enter_degrees(input_what, pos_string, neg_string):
        print
        print "Input " + input_what
        d_a = int(raw_input("Degrees: "))
        m_a = int(raw_input("Minutes: "))
        s_a = int(raw_input("Seconds: "))
        dir = int(raw_input(pos_string + " (1) or " + neg_string + " (2)"))

        # south or west - negative:
        if dir == 2:
            d_a = -d_a
            m_a = -m_a
            s_a = -s_a
            dir_x = neg_string

        # north or east - positive
        elif ns_float==1:
            dir_x = pos_string
        else:
            raise InvalidInputError("1 or 2!")
        # return d_a, m_a, s_a, dir_x
        return d_a + m_a / 60.0 + s_a / 3600.0

    def enter_degrees_loop(input_what, pos_string, neg_string):
        while True:
            try:
                return enter_degrees(input_what, pos_string, neg_string)
            except InvalidInputError, e:
                print e # output the error
                continue

    def enter_latitude():
        return enter_degrees_loop("Latitude", "North", "South")

    def enter_longitude():
        return enter_degrees_loop("Longitude", "East", "West")

    print "***Degrees/Minutes/Seconds >>> Decimal Degrees***"
    print

    latitude = enter_latitude()
    longitude = enter_longitude()

    print
    print "Results:"
    print
    print "Latitude: ", latitude
    print "Longitude: ", longitude
    print

如您所见,我做了一些额外的更改:

  • 我将转化从float()更改为int():此处有非整数没有意义
  • 我已将print语句放在他们所属的位置
  • 我使用异常来指示输入错误并将所有循环的另一层包裹起来,直到所有输入都正确
  • 我将d_a * (-1)-d_a替换为仅仅d_a * 1
  • d_a
  • 我将计算移动到最里面的函数

还能做些什么:

  • 检查正确范围的度数,分钟和秒数
  • 省略不需要的东西(例如dir_x