我希望能够获得在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
答案 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
)