我做了一个程序来执行一些天文计算。它只需要6个参数:纬度,经度,年,小时,分钟和日,因为
我相信必须有一种优雅的方式来完成工作。
该模块如下所示:
parameter1 = some1
parameter2 = some2
var_1 = some1 + some2 # or other calcs
var_2 = var1 + 'some other calcs'
var_n = opertions with some var_i with i < n
我需要获取一些var值,所以我可以添加getters函数,如:
def f_var_2:
return var_2
但我认为这不是Python方式。
我应该改为定义变量或函数吗?
def func_1 (some1, some2):
return some1 + some2
def func_2 (some1, some2):
return func_1 (some1, some2) + some other stuff
编辑以包含代码并使(我希望)正确的问题。
import math
#values used for algorithm comprobation
#this 6 values will be read from a file
latitude = 35.5
longitude = 59.0833333333
year = 2011
hour = 17
minute = 15
day = 244
local_hour = hour + minute/60.0
#for local time
universal_time = local_hour + 3 #at my location
#for UTC
#universal_time = local_hour
reference_year = 1949
delta = year - reference_year
leap = delta / 4
def julian_day (day, universal_time):
return 2432916.5 + leap + delta * 365 + day + universal_time / 24.0
time = julian_day(day, universal_time) - 2451545.0
mean_longitude = (280.46 + time * 0.9856474) % 360
mean_anomaly = ( 357.528 + 0.9856003 * time ) % 360
ecliptic_lon = (mean_longitude + math.sin(mean_anomaly * math.pi
/180) * 1.915 + 0.02 * math.sin ( mean_anomaly*math.pi/180 * 2.0 ) ) % 360
ecliptic_oblicuity = 23.429 - 0.0000004 * time
num = math.cos(ecliptic_oblicuity * math.pi/180) * math.sin(ecliptic_lon
* math.pi / 180)
den = math.cos (ecliptic_lon * math.pi /180 )
right_ascencion = math.atan (num / den)
if den < 0 :
right_ascencion = (right_ascencion + math.pi)*180/math.pi
elif num < 0 :
right_ascencion = (right_ascencion + math.pi * 2)*180/math.pi
else :
right_ascencion = right_ascencion *180/math.pi
declination = math.asin(math.sin(ecliptic_oblicuity * math.pi / 180) *
math.sin(ecliptic_lon * math.pi / 180)) / math.pi * 180
Greenwich_mean_sidereal_time = (6.697375 + 0.0657098242 * time +
universal_time) % 24
if Greenwich_mean_sidereal_time < 0:
Greenwich_mean_sidereal_time = Greenwich_mean_sidereal_time + 24
local_mean_sidereal_time = ((Greenwich_mean_sidereal_time + longitude / 15) %
24) * 15
if local_mean_sidereal_time - right_ascencion < -180:
hour_angle = local_mean_sidereal_time - right_ascencion + 360
elif local_mean_sidereal_time - right_ascencion > 180:
hour_angle = local_mean_sidereal_time - right_ascencion - 360
else:
hour_angle = local_mean_sidereal_time - right_ascencion
elevation = math.asin(math.sin(declination * math.pi / 180) * math.sin(latitude *
math.pi / 180) + math.cos(declination * math.pi / 180) * math.cos(latitude *
math.pi / 180) * math.cos(hour_angle * math.pi / 180)) / math.pi * 180
azimuth = math.asin(-math.cos(declination * math.pi / 180) * math.sin(
hour_angle * math.pi/180) / math.cos(elevation * math.pi / 180)
) * 180 / math.pi
math.sin(latitude*math.pi/180)))+180/math.pi
azimuth_corrected = 180 - azimuth
zenith_angle = 90.0 - elevation ;
cosine_zenith_angle = math.cos(zenith_angle * math.pi / 180)
def f_cosine_zenith_angle ():
return cosine_zenith_angle
在主程序中,我将有一个大矩阵(n×m矩阵,使用列表列表),其中包含纬度和经度以及矩阵的日期时间。我应用算法来计算矩阵中每个元素的cosine_zenith_angle,有时还会执行其他计算。
我正在学习编程所以我首先进行了算法实现,在我把它放在一个模块中之后,将它放在一个用于封装的类中是下一步。我使用Michalski算法进行太阳位置计算。还有其他算法,如果我用其他算法创建其他类,我想保留相同的API。这就是使用“getter”功能的原因。我用其他语言这样做了,但我读到这不是Python的方式。我想学好Python。
如果我想在其他模块中使用它,我应该为每个中间计算创建一个函数(公共)吗?我应该像现在一样保持中间计算吗?使用函数进行中间计算会有性能损失吗?
此外,如果我将每个计算都放在函数中,我就不能调用其中一个,因为它需要其他先前的结果。我必须修改所有函数以接受所有参数并向后执行计算。对?我想过使用装饰器传递参数和产生所需结果的函数名称。它会起作用吗?
答案 0 :(得分:0)
如果我理解正确,你就是这样做的:
import your_module
your_module.parameter1 = 23
your_module.parameter2 = 46
the_result = your_module.f_var_2
您正在模块中设置变量,以便其他一些变量发生变化,以便您可以得到答案。
你最好不要使用功能,它们是为此而创建的!
import your_module
the_result = your_module.f_var_1(23, 46)
当然,如果您需要多次使用相同的参数,则可以使用类。如果需要立即使用不同的参数,则可以有该类的许多实例。使用参数1,它将是全局可访问的,它可以防止应用程序的不同部分按原样使用模块。想象一下,如果一个部分改变了参数,但没想到其他部分也会这样做。