在Python函数中何时使用*和**作为参数
我什么时候可以在Python函数的参数中使用*
和**
呢?也就是说:
def fun_name(arg1, *arg2 , ** arg3):
3 个回答
当你希望你的函数能够接受不带名字的位置参数(用*
表示),或者额外的带名字的参数(用**
表示)时,就可以使用这些符号。
其实在每个函数的定义里都加上*args, **kwargs
是可以的,不过如果传入更多的参数其实没有什么用的话,这样做可能就不是个好主意。
我什么时候可以在Python函数的参数中使用*和**?也就是说:
简单来说:当你需要传递可变数量的参数给你的函数时,就可以使用它们。
不过,我觉得这个问题问得有点宽泛。你最好多了解一下这些概念,自己尝试一下,然后再在这里问具体的问题。
@Wooble的回答会对你有帮助;但更重要的是理解*args
和**kwargs
的作用。这样你就能根据遇到的情况灵活使用它们。
你可以在以下链接中了解更多关于可变参数和关键字参数的概念:
你提问的时候提到,你并不是在函数调用时使用这些符号,而是在创建函数时使用它们。*
和 **
在这两种情况下的作用是不同的。
当你在定义一个函数时,这些符号表示位置参数会被放在一个元组里,而关键字参数会被放在一个字典里。没错,我刚才说的是参数,但在这种情况下它们是应用在参数上的。
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
。