从Python中的函数返回不同数量的返回值是否可以/良好实践?如果是,调用方应该如何处理返回值?例如:
def func():
if(condition_1):
return 1,2
if(condition_2):
return 1
if(condition_3):
return 1,2,3,4
注释:、condition_1、condition_2和condition_3是函数函数的本地函数,因此调用方不知道将返回多少值。
发布于 2015-06-08 07:54:28
函数返回多个值是pythonic吗?对此有一个很好的解释。
但在你的例子中,它取决于你的用例。如果您知道如何处理返回的数据,那么使用它就没有问题。比如:
def func():
if(condition_1):
return a,b
if(condition_2):
return (a, )
if(condition_3):
return c,d,e,f
if(condition_4):
return a,b
vals = func()
if len(vals) == 2:
# We are sure that we will get `a,b` in return
do something ...
elif len(vals) == 3:
...
在上面的例子中,处理vals
元组的函数知道如何根据某些标准处理返回的数据。它有两个返回相同数据的return
可能性!
如果您确切地知道如何处理数据,那么可以使用不同的返回数。这里的关键点是函数做一个单一的工作,。如果您在识别返回值方面有问题,那么您的函数正在执行多个任务,或者您必须避免使用不同数量的参数。
发布于 2015-06-08 07:32:36
可以返回多个值,但必须将所有返回保持在相同的形式/类型中,以便使用:
def func():
if(condition_1):
return 1, 2
if(condition_2):
return 1, # return a tuple same as the others
if(condition_3):
return 1, 2, 3, 4
发布于 2015-06-08 08:27:47
我会避免这样做的。通常(尽管偶尔会有例外),正如其他人所提到的,从函数的每个分支返回相同类型的对象是一个好主意。然而,这不仅仅是用一个元素元组包装单数返回值--考虑一种模式,在这种模式中,您返回相同数量的事物(按相同的顺序),并对不适用于该分支的任何事物使用None
或特定于类型的“null”值( 空对象模式)。
这意味着客户端代码始终可以这样做:
a, b, c, d, e = func()
忽略任何它不关心的价值观。如果混合中也有空对象模式,那么即使是关心可能不存在的值的代码也可能不需要对它们进行特殊处理。如果您更改了元组的长度,则每个调用都必须为任何分支的结果做准备,这意味着它几乎必须与您的分支匹配。
对于您和调用代码来说,执行这种模式的一个非常好的方法是使用collections.namedtuple
。这也有很好的好处,使您的代码立即更自我文档化。
https://stackoverflow.com/questions/30703301
复制相似问题