gpt4 book ai didi

python - 具有可选返回值的 Python 函数中的惰性存储和代码执行

转载 作者:行者123 更新时间:2023-11-28 21:37:20 24 4
gpt4 key购买 nike

如果我有一个返回多个输出的函数,其中有时不需要某些输出,我发现使用下划线“忽略”这些输出是一种约定,例如

a, _ = fn_with_two_outputs()

到目前为止,我假设该值刚刚被删除,并天真地希望编译器足够聪明,不会执行与该值关联的任何代码。但在最近的调试 session 中,我注意到此方法实际上使用输出创建了一个变量 _ - 这浪费了内存,并且应该阻止使用下划线约定,不是吗? ?

我现在倾向于这种变体:

a = fn_with_two_outputs()[0]

我在 other ways of "ignoring output" 中找到的,因为据我测试,至少它不会将输出 fn_with_two_outputs()[1] 存储为调用函数的环境中的变量(它是存储在函数环境本身中)。为了避免讨论:要获得多个返回值而不调用两次,可以使用切片,例如fn_with_two_outputs()[0:4]

但是:返回值 - 无论是否“忽略” - 似乎总是被评估。我用下面的代码测试了“忽略”它的三种变体。

def fn_with_two_outputs():
a = [1, 2, 3]
b = [0, 0, 0]
return a, needless_fn(b)

def needless_fn(b):
print("\"Be so good they can't ignore you.\" - Steve Martin")
return b

# I want to ignore output b (wrapped by needless_fn)
a, _ = fn_with_two_outputs() # stores _ = b, needless_fn was executed
a, *b = fn_with_two_outputs() # suggested for Python3, stores a list b = [b], needless_fn was executed
a = fn_with_two_outputs()[0] # b nowhere to be found, but needless_fn was executed

是否有一种方便的方法来实际忽略函数本身的输出,从而使可选输出不消耗任何内存并导致代码执行?我的第一个想法是,给出 fn( ) 一个在两个 return 语句之间分支的参数,一个“惰性”,另一个不是 - 但这看起来更像是一种解决方法,而不是一个优雅的解决方案。

最佳答案

该功能应该更改。它要么做两件独立的事情,要么第二件事依赖于第一件事。如果它们是独立的,那么这些东西应该是两个功能。

如果它们相互依赖,请将其设为两个函数,如下所示:

a = step_a()
b = step_b(a)

如果你只想要a,那么你只需写第一行。如果您希望昂贵的计算产生b,则调用第二个函数。这样用户只需为他们想要计算的内容付费。

如果依赖关系相反,您将始终需要进行昂贵的计算。

关于python - 具有可选返回值的 Python 函数中的惰性存储和代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49694128/

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