gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:16:02 31 4
gpt4 key购买 nike

假设我有一个 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com