在Python函数中何时使用*和**作为参数

2 投票
3 回答
3731 浏览
提问于 2025-04-16 04:16

我什么时候可以在Python函数的参数中使用***呢?也就是说:

def fun_name(arg1, *arg2 , ** arg3):

3 个回答

1

当你希望你的函数能够接受不带名字的位置参数(用*表示),或者额外的带名字的参数(用**表示)时,就可以使用这些符号。

其实在每个函数的定义里都加上*args, **kwargs是可以的,不过如果传入更多的参数其实没有什么用的话,这样做可能就不是个好主意。

3

我什么时候可以在Python函数的参数中使用*和**?也就是说:

简单来说:当你需要传递可变数量的参数给你的函数时,就可以使用它们。

不过,我觉得这个问题问得有点宽泛。你最好多了解一下这些概念,自己尝试一下,然后再在这里问具体的问题。

@Wooble的回答会对你有帮助;但更重要的是理解*args**kwargs的作用。这样你就能根据遇到的情况灵活使用它们。

你可以在以下链接中了解更多关于可变参数和关键字参数的概念:

  1. http://www.network-theory.co.uk/docs/pytut/KeywordArguments.html
  2. http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/
11

你提问的时候提到,你并不是在函数调用时使用这些符号,而是在创建函数时使用它们。*** 在这两种情况下的作用是不同的。

当你在定义一个函数时,这些符号表示位置参数会被放在一个元组里,而关键字参数会被放在一个字典里。没错,我刚才说的是参数,但在这种情况下它们是应用在参数上的。

def example(*args, **kwargs):
    print "args: {0}".format(args)
    print "kwargs: {0}".format(kwargs)

example(1, 2, 'a', foo='bar', bar='foo')

运行这个代码时,会输出:

args: (1, 2, 'a')
kwargs: {'foo': 'bar', 'bar': 'foo'}

你明白我说的“我们把它应用在函数定义的参数上”是什么意思吗?参数是 1, 2, 'a', foo='bar', bar='foo',而定义的参数是 *args, **kwargs

现在我给你一个例子,看看如何把它们应用到参数上。

def example2(a, b, foo=None, bar=None):
    print "a: {0}, b:{1}, foo:{2}, bar: {3}".format(a, b, foo, bar)

args = (1, 2)
kwargs = {'foo': 'bar', 'bar': 'foo'}
example2(*args, **kwargs)

这个代码会输出:

a: 1, b:2, foo:bar, bar: foo

你可以看到,当我们把它们应用到参数上(也就是在调用函数时),* 的作用是把一个列表或元组展开,以填充函数的位置参数,而 ** 的作用是把一个字典展开,以填充函数的关键字参数。你只需要确保在展开后,总的参数数量是合适的,不多也不少。

在最后一个例子中,参数是 *args, **kwargs,而定义的参数是 a, b, foo=None, bar=None

撰写回答