在 Python 的初始条件列表中合并默认值和用户输入
Incorporating defaults and user inputs in list of initial conditions in Python
我正在研究热力学函数库。其中许多函数都涉及求根,这需要对值进行初始猜测。我想提供一个建议的函数来获得这些初始猜测,但仍然允许用户提供其他初始猜测。我想出的解决方案最终看起来像(例如):
def eq_tp(temp,pres,initairf=None,initdhum=None):
if any(init is None for init in (initairf,initdhum)):
res = approx_tp(temp,pres)
if initairf is None: initairf = res[0]
if initdhum is None: initdhum = res[1]
x0 = [initairf,initdhum]
...
其中 approx_tp
是获取初始条件的默认函数。
是否有更多 "pythonic" 方法可以做到这一点,或者这种方法有什么缺点吗?通常,逼近函数非常快,所以我可以每次都进行该计算并跳过 if any
构造,但如果不需要,最好避免该计算。在这个例子中,只有 2 个初始值需要填写,但这个数字的范围是 1-6,所以填写 x0
数组可以做得更好。由于这是一个在库中重复 十几次 次的构造,我确实希望它相当快但可读。
你的方法很好。这是每次调用 approx_tp
的替代方法:
def eq_tp(temp, pres, initairf=None, initdhum=None):
x0 = [default if value is None else value for default, value
in zip(approx_tp(temp, pres), [initairf, initdhum])]
如果你只想在必要时调用函数,你可以使用这个版本:
def eq_tp(temp, pres, initairf=None, initdhum=None):
default_args = default_values = (initairf, initdhum)
if any(init is None for init in default_args):
default_values = approx_tp(temp, pres)
x0 = [default if value is None else value for default, value
in zip(default_values, default_args)]
这也适用于三个或更多默认参数而无需添加更多行,只需将它们添加到 default_args
.
我正在研究热力学函数库。其中许多函数都涉及求根,这需要对值进行初始猜测。我想提供一个建议的函数来获得这些初始猜测,但仍然允许用户提供其他初始猜测。我想出的解决方案最终看起来像(例如):
def eq_tp(temp,pres,initairf=None,initdhum=None):
if any(init is None for init in (initairf,initdhum)):
res = approx_tp(temp,pres)
if initairf is None: initairf = res[0]
if initdhum is None: initdhum = res[1]
x0 = [initairf,initdhum]
...
其中 approx_tp
是获取初始条件的默认函数。
是否有更多 "pythonic" 方法可以做到这一点,或者这种方法有什么缺点吗?通常,逼近函数非常快,所以我可以每次都进行该计算并跳过 if any
构造,但如果不需要,最好避免该计算。在这个例子中,只有 2 个初始值需要填写,但这个数字的范围是 1-6,所以填写 x0
数组可以做得更好。由于这是一个在库中重复 十几次 次的构造,我确实希望它相当快但可读。
你的方法很好。这是每次调用 approx_tp
的替代方法:
def eq_tp(temp, pres, initairf=None, initdhum=None):
x0 = [default if value is None else value for default, value
in zip(approx_tp(temp, pres), [initairf, initdhum])]
如果你只想在必要时调用函数,你可以使用这个版本:
def eq_tp(temp, pres, initairf=None, initdhum=None):
default_args = default_values = (initairf, initdhum)
if any(init is None for init in default_args):
default_values = approx_tp(temp, pres)
x0 = [default if value is None else value for default, value
in zip(default_values, default_args)]
这也适用于三个或更多默认参数而无需添加更多行,只需将它们添加到 default_args
.