我有一个返回值的可变列表的函数,我知道您可以使用元组来做到这一点。要分配这些变量,您可以执行类似a, b = func(..)
的操作。但是,如果仅返回一个值,则必须执行a, = func(..)
[注意,而不是a = func(..)
。要实现后者,您可以进行测试以查看是否有一个值要返回或更大(请参见下面的示例),但是我想知道是否没有更简单或更简单的方法来实现此目的。
def foo(*args):
returnvalues = []
for arg in args:
arg += 100
returnvalues.append(arg)
if len(returnvalues) == 1:
return returnvalues[0]
else:
return tuple(returnvalues)
def baz(*args):
returnvalues = []
for arg in args:
arg += 100
returnvalues.append(arg)
return tuple(returnvalues)
a = foo(10)
b, c = foo(20, 30)
print(f'a={a}, b={b}, c={c}')
a, = baz(10)
b, c = baz(20, 30)
print(f'a={a}, b={b}, c={c}')
#
a=110, b=120, c=130
a=110, b=120, c=130
答案 0 :(得分:1)
我相信您指的是“元组拆箱”。也称为破坏性分配。 “元组”一词有点用词不当,因为您可以使用任何可迭代的/迭代器。因此,返回列表很好。
def f():
return [1]
(a,) = f()
b, = f()
您还可以在左侧使用列表语法。生成的字节码没有区别。在b
的情况下,确实可以使单个项目的包装看起来不太像语法错误,而比a
的详细程度要少。
[c] = f()
在只传递一个参数的特殊情况下,我会避免返回值本身而不是列表。这样做的原因是它使得代码难以以通用方式使用。该函数的任何调用者都需要知道它传递了多少个参数或检查返回值(笨拙)。例如:
result = f()
if isinstance(result, (list, tuple)):
smallest = min(result)
else:
smallest = result
# as opposed to this when you always return a list / tuple
smallest = min(f())
答案 1 :(得分:0)
您可以将此类函数的返回值分配给单个变量,以便将其用作列表或元组:
a = baz(10, 20, 30)
print(', '.join(map(str, a))) # this outputs 110, 120, 130