在python中返回解包列表

在python中返回解包列表,python,Python,我试图在python中创建一个函数,它接受任意数量的参数,对参数运行一些操作,最后返回新值。例如: def foo(*args): return *[i ** 2 for i in args] # error: cant use starred expression here a, b, c, d = foo(2, 15, 17, 21) 它没有“解包”列表,而是抛出一个语法错误。从技术上讲,我可以省去所有的“解包”,让用户编写 def foo(*args): return

我试图在python中创建一个函数,它接受任意数量的参数,对参数运行一些操作,最后返回新值。例如:

def foo(*args):
    return *[i ** 2 for i in args] # error: cant use starred expression here

a, b, c, d = foo(2, 15, 17, 21)
它没有“解包”列表,而是抛出一个语法错误。从技术上讲,我可以省去所有的“解包”,让用户编写

def foo(*args):
    return [i ** 2 for i in args]

a, b, c, d = foo(2, 15, 17, 21) # works

e = foo(82) # e is now a list and not just the value
这在有多个参数时有效,但在我只给出一个参数时无效。有没有什么方法可以不需要使用if语句来检查给定的输入数量而轻松地完成这项工作

def foo(*args):
    return [i ** 2 for i in args]

a, b, c, d = foo(2, 15, 17, 21)

按预期工作。当然,您必须确保返回的列表中的项目数与分配左侧的项目数完全相同。

您可以解压缩一个单值列表,只需在分配给的名称后面加一个逗号即可:

e, = foo(82)

这与创建1元组时需要使用的语法相同。您需要使用
(x,)
,因为
(x)
x
相同(括号不创建元组,逗号创建元组)。

可以解压元组,包括
list
。您可以返回一个列表。但它仍然非常危险,因为它的长度没有被检查。“未打包的值”不是一件事。你可以退回可以拆开的东西,然后再拆开。其中一项是一种特殊情况,您需要在调用方处理,或者在函数中通过返回not-a-list来处理。哦,对不起,我应该更清楚一些。当参数的数量大于1时,这种方法有效。如果只输入一个参数,则会得到一个列表作为结果。