在Python中将具有多个返回值的函数作为参数传递

在Python中将具有多个返回值的函数作为参数传递,python,return-value,function-calls,Python,Return Value,Function Calls,因此,Python函数可以返回多个值。我突然想到,如果能做到以下几点,这将是很方便的(尽管可读性稍差) a = [[1,2],[3,4]] def cord(): return 1, 1 def printa(y,x): print a[y][x] printa(cord()) ……但事实并非如此。我知道,通过将两个返回值都转储到临时变量中,也可以做同样的事情,但它看起来并不优雅。我还可以将最后一行重写为“printa(cord()[0],cord()[1])”,但这将执

因此,Python函数可以返回多个值。我突然想到,如果能做到以下几点,这将是很方便的(尽管可读性稍差)

a = [[1,2],[3,4]]

def cord():
    return 1, 1

def printa(y,x):
    print a[y][x]

printa(cord())
……但事实并非如此。我知道,通过将两个返回值都转储到临时变量中,也可以做同样的事情,但它看起来并不优雅。我还可以将最后一行重写为“printa(cord()[0],cord()[1])”,但这将执行cord()两次

有没有一种优雅、高效的方法可以做到这一点?或者我应该看到关于过早优化的引述,然后忘记这一点吗

printa(*cord())
*
这里是一个参数展开运算符。。。我忘记了它在技术上的名称,但在这里,它接受一个列表或元组,并将其展开,以便函数将每个列表/元组元素视为一个单独的参数

它基本上与用于捕获函数定义中所有非关键字参数的
*
相反:

def fn(*args):
    # args is now a tuple of the non-keyworded arguments
    print args

fn(1, 2, 3, 4, 5)
打印
(1,2,3,4,5)

做同样的事。

试试这个:

>>> def cord():
...     return (1, 1)
...
>>> def printa(y, x):
...     print a[y][x]
...
>>> a=[[1,2],[3,4]]
>>> printa(*cord())
4
星号基本上表示“使用此集合的元素作为位置参数”。您可以使用两个星号对关键字参数的dict执行相同的操作:

>>> a = {'a' : 2, 'b' : 3}
>>> def foo(a, b):
...    print a, b
...
>>> foo(**a)
2 3

实际上,Python并没有真正返回多个值,它只返回一个值,这个值可以是打包到元组中的多个值。这意味着您需要“解包”返回值以获得倍数。 像这样的陈述

x,y = cord()
这样做,但直接使用返回值,就像在

printa(cord())
没有,这就是为什么你需要使用星号。可能一个很好的术语是“隐式元组解包”或“无赋值元组解包”。

文档:
printa(cord())