【问题标题】:Using variables from a returned function as arguments in another function使用返回函数中的变量作为另一个函数的参数
【发布时间】:2014-03-13 13:44:04
【问题描述】:

我有一个函数,它有 4 个参数定义为:

call(a,b,c,d):

我有另一个函数叫做

return_args() #that returns 4 variables. 

当我执行以下操作时:

call(return_args()) #it errors out saying, that's 1 arguments, not 4 arguments 

我知道我可以将 4 个变量存储在 call() 之前的另一行中,但可以在 call() 行中返回所有变量。

【问题讨论】:

    标签: python function return


    【解决方案1】:

    可以使用*参数解包

    call(*return_args())
    

    这是以下内容的简写形式:

    a, b, c, d = return_args()
    call(a, b, c, d)
    

    甚至

    tup = return_args()
    call(*tup)
    

    以这种方式使用的 Python 的 * 运算符本质上是说“解压这个元组并将解压后的值作为参数传递给这个函数”。

    相关的运算符** 对关键字参数执行类似的技巧:

    def call(arg1=None, arg2=None, **kwargs):
        pass
    
    kwargs = {'arg1': 'test', 'arg3': 'whatever'}
    call(**kwargs)
    

    *** 可以一起使用:

    def call(*args, **kwargs):
        pass
    call(*return_args(), **kwargs)
    

    【讨论】:

      【解决方案2】:

      您可以使用* 运算符将列表作为单独的参数发送:

      call(*return_args())
      

      【讨论】:

        【解决方案3】:

        使用“变量解包”语法: call( *return_args() )

        您也可以使用过时的语法:apply( call, return_args() )

        【讨论】:

          【解决方案4】:
          return_args() #that returns 4 variables. 
          

          这是一个误解,它不返回 4 个变量。像这样的函数:

          def return_args():
              return 1, 2, 3, 4
          

          实际上是这样做的:

          def return_args():
              mytuple = (1, 2, 3, 4)
              return mytuple
          

          返回一个东西。

          另一方面是 Python 中的“解构赋值”,也就是这样做的能力:

          a, b = 1, 2
          

          这是一种同时分配/绑定两个变量的方法,但它实际上是创建然后解压缩序列(1,2)。你可以写:

          a, b, c, d = return_args()
          

          看起来你返回了四个东西并将它们绑定到四个变量名,这是一个干净、有用的抽象,但事实并非如此——实际上创建了一个序列(其中包含 4 个东西),然后将其解压缩为匹配一系列变量名。

          这两个抽象泄漏,当你尝试这样做时,你会发现 return_args() 正在返回一个东西:

          call(return_args()) #it errors out saying, that's 1 arguments, not 4 arguments
          

          其他答案正确地建议 call(*return_args()) 作为一种解决方案,它记录在“解包参数列表”下:http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists

          (另一方面是为接受此处讨论的可变数量参数而创建的函数:https://stackoverflow.com/a/11550319/478656

          【讨论】:

            猜你喜欢
            • 2020-10-04
            • 1970-01-01
            • 2018-11-09
            • 1970-01-01
            • 2022-01-13
            • 2018-11-13
            • 2021-04-21
            • 2019-10-11
            • 1970-01-01
            相关资源
            最近更新 更多