在 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.