python - 从 Python 中的函数返回中间结果

标签 python function

假设我有一个 Python 模块,里面有一些功能:

def sumvars(x, y, z):
    s = x
    s += y
    s += z
    return s

但有时我想获得一些中间计算的结果(例如,我可能有一个反转矩阵的函数,并且想知道作为中间步骤计算的行列式)。显然,如果这些计算已经在该函数中完成,我不想再次重做这些计算。

我的第一个想法是返回一个字典:

def sumvars(x, y, z):
    d = {}
    s = x
    d['first_step'] = s
    s += y
    d['second_step'] = s
    s += z
    d['final'] = s
    return d

但我不记得 numpy 或 scipy 中有任何返回指令的函数,所以这似乎不是一个好主意。 (为什么?)通常我总是必须键入 sumvars(x,y,z)['final'] 以获得默认返回值......

我看到的另一个选项是创建全局变量,但在我的模块中有一堆全局变量似乎是错误的,我需要记住它们的名称,而且不附加到函数本身看起来是一个糟糕的设计选择。

对于这种情况,正确的功能设计是什么?

最佳答案

通常,当您有两种不同的方式返回数据时,请继续创建两个不同的函数。毕竟,“扁平比嵌套好”。只需让一个调用另一个,这样您就不会重复自己。

例如,在标准库中,urllib.parseparse_qs(它返回一个dict)和parse_qsl(返回一个列表)。 parse_qs 然后调用另一个:

def parse_qs(...):

    parsed_result = {}
    pairs = parse_qsl(qs, keep_blank_values, strict_parsing,
                      encoding=encoding, errors=errors)
    for name, value in pairs:
        if name in parsed_result:
            parsed_result[name].append(value)
        else:
            parsed_result[name] = [value]
    return parsed_result

非常简单。所以在你的例子中似乎很好

def sumvars(x, y, z):
    return sumvars_with_intermediates(x, y, z).final

def sumvars_with_intermediates(x, y, z):
    ...
    return my_namedtuple(final, first_step, second_step)

(我喜欢从我的 API 返回 namedtuple 而不是 dict,它更漂亮)

另一个明显的例子是在re中:re.findall是它自己的函数,而不是一些search的配置标志。

现在,标准库是一个庞大的东西,由许多作者创建,因此您会找到每个示例的反例。不过,您会更频繁地看到上述模式,而不是一个接受某些配置标志的综合函数,而且我发现它更具可读性。

关于python - 从 Python 中的函数返回中间结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22033415/

相关文章:

python - 为什么更新后我的 pip 停止了

python - 提高 numpy 三角函数运算的性能

ios - swift |强制取消执行代码

c++ - 可能影响功能所用时间的事情

scala - def没有参数

python - Airflow 在单个 DAG 中生成动态任务,任务 N+1 依赖于任务 N

python - python中复制函数的区别

javascript - 用户从下拉列表中选择选项后如何更改 url 值

php - 数组中的匿名函数

c++ - 在函数内访问调用成员函数的对象