可选多返回值

10

我有一个函数,大部分情况下应该返回单个值,但有时需要从函数返回第二个值。 这里我找到了如何返回多个值,但由于大多数情况下我只需要其中一个值,所以我想编写类似于以下内容的代码:

def test_fun():
    return 1,2

def test_call():
    x = test_fun()
    print x

但调用此功能会导致以下结果:
>>> test_call()
(1,2)

当尝试返回两个以上的内容时,例如:

def test_fun2():
    return 1,2,3

def test_call2():
    x,y = test_fun2()
    print x,y

我遇到了一个错误。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "my_module.py", line 47, in test_call2
    x,y = test_fun2()
ValueError: too many values to unpack

我在思考类似于Matlab的问题,其中x = test_fun()将导致x == 1(而[x y] = test_fun()也可以正常工作)。在Python中是否有类似的功能?

2个回答

18
您可以使用星号解包将所有额外的返回值聚合到一个列表中:
x, *y = fun()

x将包含第一个返回值。如果只有一个返回值,则y将为空列表。如果函数返回的是元组,即使只有一个值,此特定示例也仅适用于元组。

如果fun始终返回1或2个值,你可以直接这样做:

if y:
    print(y[0])
else:
    print('only one value')

如果您希望完全忽略返回值的数量,请执行以下操作:

*x = fun()

现在所有的参数将被收集到列表中。接下来可以使用任一种方式打印它。

print(x)
或者
print(*x)

后者将每个元素作为单独的参数传递,就像您所做的那样。

x, y, z = fun()
print(x, y, z)

使用*x = fun()而不是简单地使用x = fun()的原因是,在函数返回不是元组时立即获得错误。将其视为一种断言,以提醒您正确编写fun

由于这种星号展开形式仅适用于Python 3,在Python 2中唯一的选择是执行

x = fun()

并手动检查结果。


不完全是我所希望的,但至少通过这种方法,我可以避免在调用函数中索引列表。我想我只需要包装“test_fun”,这样“test_call”就不必关心“*y”了。感谢您的帮助。 - 463035818_is_not_a_number
@user463035818。希望我的更新能让你的工作更轻松。 - Mad Physicist
是的,谢谢。我对Python还很新,所以欢迎任何建议。顺便说一下,我在这里提问的动机是为了避免命名第二个返回值,以防我只需要第一个返回值,我想x,*y = ...是我能得到的最接近的答案。 - 463035818_is_not_a_number
@user463035818。刷新一下。我添加了一个关于只使用 *x 的注释。 - Mad Physicist
1
@ABDUL。这在py3之外不起作用。在更新中注意到了。 - Mad Physicist

1
有几种方法可以获取多个返回值。
示例1:
def test_fun():
    return 1,2

def test_call():
    x, y = test_fun()
    print x
    print y

你将会得到正确的输出:
1
2

当您想忽略多个返回值时,可以在python3中的变量前使用*
示例2:
def test_fun2():
    return 1,2,3

def test_call2():
    x, *y = test_fun2()
    print x
    print y

你将得到结果:
1
(2, 3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接