【问题标题】:Advantages of using *args in python instead of passing a list as a parameter在 python 中使用 *args 而不是将列表作为参数传递的优点
【发布时间】:2010-05-18 08:13:16
【问题描述】:

我正在使用 python,我想知道除了美观之外,使用 *args 作为参数比只传递列表作为参数有什么优势?

【问题讨论】:

    标签: python


    【解决方案1】:

    通常,它用于将参数列表传递给通常采用固定数量参数的函数,或者在函数定义中允许以普通参数的样式传递可变数量的参数。例如,print() 函数使用可变参数,以便您可以执行 print(a,b,c) 之类的操作。

    最近的一个 SO 问题中的一个示例:您可以使用它将range() 结果列表的列表传递给itertools.product(),而无需知道列表列表的长度。

    当然,您可以将每个库函数编写成如下所示:

    def libfunc1(arglist):
        arg1 = arglist[1]
        arg2 = arglist[2]
        ...
    

    ...但这违背了命名位置参数变量的意义,它基本上正是*args 为您所做的,它会导致多余的大括号/括号,因为您必须调用这样的函数:

    libfunc1([arg1val,arg2val,...])
    

    ...看起来与...非常相似

    libfunc1(arg1val,arg2val,...)
    

    ...除了不必要的字符,而不是使用*args

    【讨论】:

    • 谢谢,但是我在问这与将列表作为参数传递相比有什么优势。显然python的设计者出于某种原因更喜欢这种方法,因为除了美观之外,这种方法似乎完全是多余的。
    • 添加了一个例子。最大的好处之一是它允许您轻松地将不同长度的东西传递给标准库函数,而无需重写库函数。
    • 您能解释一下如何使用 *args “将参数列表传递给通常采用固定数量参数的函数”吗?采用固定数量参数的函数示例:fn(arg1)。例如,arg1 可以是一个字符串。如果使用 *args 而不是 arg1,则方法创建者已经允许该方法在创建时采用可变数量的参数,并且使用列表而不是 *args 会带来相同的结果。
    【解决方案2】:

    这是为了灵活性

    它允许你传递参数,而不知道你需要多少。一个典型的例子:

    def f(some, args, here): # <- this function might accept a varying nb of args
        ...
    
    def run_f(args, *f_args):
        do_something(args)
        # run f with whatever arguments were given:
        f(*f_args)
    

    请务必查看 ** 关键字版本。

    【讨论】:

    • 谢谢 :),这回答了我的问题
    猜你喜欢
    • 2021-09-02
    • 2022-11-02
    • 2011-01-20
    • 1970-01-01
    • 2022-01-02
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多