【问题标题】:Expanding tuples into arguments将元组扩展为参数
【发布时间】:2010-12-31 21:53:36
【问题描述】:

有没有办法将 Python 元组扩展为函数 - 作为实际参数?

例如,expand() 会发挥作用:

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

我知道可以将myfun 定义为myfun((a, b, c)),但当然也可能存在遗留代码。 谢谢

【问题讨论】:

    标签: python tuples parameter-passing


    【解决方案1】:

    myfun(*some_tuple) 完全符合您的要求。 * 运算符简单地解包元组(或任何可迭代的)并将它们作为位置参数传递给函数。阅读有关unpacking arguments 的更多信息。

    【讨论】:

    • * 运算符简单地解包元组并将它们作为位置参数传递给函数。在此处查看更多信息:docs.python.org/3/tutorial/…
    • 请注意,相同的语法可用于列表和元组。
    • 我发现你可以对列表做同样的事情,(事实上,任何可迭代的,包括字符串),不确定它们的可变性如何影响事物。这会很有趣。
    【解决方案2】:

    请注意,您还可以扩展部分参数列表:

    myfun(1, *("foo", "bar"))
    

    【讨论】:

    • 看来你只能在扩展元组在正常提供的参数之后才能这样做——当我这样做时解释器不喜欢它:some_func(*tuple_of_stuff, another_argument)
    • @Quackmatic 在 Python 3.5.1 中将扩展元组放在任何位置似乎都可以正常工作
    • @Quackmatic 支持@River,这在 Python 3.5.4 中运行良好:def func(a,b,c,d): print(a,b,c,d)args = ('fee', 'fi', 'fo'); func(*args, 'fum')
    【解决方案3】:

    查看the Python tutorial 第 4.7.3 和 4.7.4 节。 它谈到将元组作为参数传递。

    我还会考虑使用命名参数(并传递字典)而不是使用元组并传递序列。当位置不直观或有多个参数时,我发现使用位置参数是一种不好的做法。

    【讨论】:

      【解决方案4】:

      这是函数式编程方法。它将元组扩展功能从语法糖中提取出来:

      apply_tuple = lambda f, t: f(*t)
      

      通过curry重新定义apply_tuple,从长远来看可以节省大量partial调用:

      from toolz import curry
      apply_tuple = curry(apply_tuple)
      

      示例用法:

      from operator import add, eq
      from toolz import thread_last
      
      thread_last(
          [(1,2), (3,4)],
          (map, apply_tuple(add)),
          list,
          (eq, [3, 7])
      )
      # Prints 'True'
      

      【讨论】:

      【解决方案5】:

      类似于@Dominykas 的回答,这是一个将接受多参数的函数转换为接受元组的函数的装饰器:

      apply_tuple = lambda f: lambda args: f(*args)
      

      示例 1:

      def add(a, b):
          return a + b
      
      three = apply_tuple(add)((1, 2))
      

      示例 2:

      @apply_tuple
      def add(a, b):
          return a + b
      
      three = add((1, 2))
      

      【讨论】:

      • 你也可以只定义: def add(some_tyuple: tuple) 然后用索引访问
      【解决方案6】:

      features[2] 是一个元组 (“白人”、“失业”、“收入”)

      现在使用 features[2] 作为列的参数列表

      all_data[list(np.asarray(features[2]))]
      

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 2012-11-07
        • 2021-07-04
        • 1970-01-01
        • 2010-10-15
        相关资源
        最近更新 更多