17

因此,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()。

有没有一种优雅、有效的方法来做到这一点?还是我应该只看到关于过早优化的引用而忘记这一点?

4

3 回答 3

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

fn(*[1, 2, 3, 4, 5])

做同样的事情。

于 2009-03-27T19:56:57.047 回答
6

试试这个:

>>> 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
于 2009-03-27T19:58:47.123 回答
4

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

x,y = cord()

这样做,但直接使用返回值,就像你在

printa(cord())

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

于 2009-03-27T22:56:10.707 回答