从函数输出变量值列表

时间:2018-08-28 07:11:28

标签: python

我有一个返回值的可变列表的函数,我知道您可以使用元组来做到这一点。要分配这些变量,您可以执行类似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

2 个答案:

答案 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