【问题标题】:Passing functions which have multiple return values as arguments in Python在 Python 中传递具有多个返回值的函数作为参数
【发布时间】:2010-10-16 00:44:30
【问题描述】:

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

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

【问题讨论】:

    标签: python return-value function-calls


    【解决方案1】:
    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])
    

    做同样的事情。

    【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

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

      这样的声明
      x,y = cord()
      

      这样做,但像在

      中那样直接使用返回值
      printa(cord())
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 2013-08-18
        • 1970-01-01
        • 2018-04-09
        • 2021-03-25
        • 1970-01-01
        相关资源
        最近更新 更多