Python 从函数输出值的变量列表

Python 从函数输出值的变量列表,python,Python,我有一个函数,它返回一个变量值列表,我知道可以使用元组来实现这一点。要分配这些变量,您可以执行类似于a,b=func。。。但是,如果只返回一个值,则必须执行,=func。。[注意,]而不是a=func。。。为了实现后者,您可以包括一个测试,以查看是否有一个或多个值要返回,请参见下面的示例,但我想知道是否没有更简单或更详细的方法来执行此操作 def foo(*args): returnvalues = [] for arg in args: arg += 100

我有一个函数,它返回一个变量值列表,我知道可以使用元组来实现这一点。要分配这些变量,您可以执行类似于a,b=func。。。但是,如果只返回一个值,则必须执行,=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

您可以将此类函数的返回值指定给单个变量,以便将其用作列表或元组:

a = baz(10, 20, 30)
print(', '.join(map(str, a))) # this outputs 110, 120, 130

我相信你指的是元组解包。也称为破坏性分配。tuple这个词有点用词不当,因为您可以使用任何iterable/迭代器。因此,返回一个列表是可以的

def f():
    return [1]

(a,) = f() 
b, = f() 
您还可以在左侧使用列表语法。生成的字节码没有区别。在b的情况下,解包单个项目看起来不像是语法错误,而且比a稍微简单一些

在只传递一个参数的特殊情况下,我将避免返回值本身而不是列表。原因是它使代码更难以通用方式使用。函数的任何调用方都需要知道它传递了多少个参数,或者检查返回值,这很笨拙。例如:

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()) 

如果你有一个未知长度的列表,那么首先把它分配给各个变量是没有意义的,不是吗?看看这个
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())