函数参数中的与运算符是Python中常用的两个运算符,主要用于函数的参数传递。其中号表示解包,**号表示解包键值对。
- 解包
在函数定义时,如果在参数前加上*,那么表示这些参数将会作为元组(tuple)传入函数并被解包:
def foo(*args):
for arg in args:
print(arg)
foo(1, 2, 3)
上面代码中,foo函数的参数前使用了*,这样传入的1, 2, 3就被放进了一个元组args里面。然后我们就可以使用for循环遍历这个元组并打印出每个元素的值。
- 解包键值对
在函数定义时,如果在参数前加上**,那么表示这些参数将会作为字典(dict)传入函数并被解包:
def bar(**kwargs):
for key, value in kwargs.items():
print(key + ": " + str(value))
bar(name="Michael", age=20, sex="male")
上面代码中,bar函数的参数前使用了**,这样传入的name=”Michael”, age=20, sex=”male”就被放进了一个字典kwargs里面。然后我们就可以使用for循环遍历这个字典并打印出每个键值对的键和值。
- 解包与其他参数类型混用
在函数定义时,和*也可以和其他参数类型一起使用,但是要注意顺序。一般来说,顺序应该是位置参数、可变参数、关键字参数和命名关键字参数。
def foobar(name, *args, sex="male", **kwargs):
print(name)
for arg in args:
print(arg)
print(sex)
for key, value in kwargs.items():
print(key + ": " + str(value))
foobar("Michael", 1, 2, 3, age=20)
上面代码中,foobar函数的参数顺序为:位置参数name,可变参数args,关键字参数sex和命名关键字参数*kwargs。在调用函数时,我们可以传入位置参数name,然后将1、2、3作为可变参数args传入,再将age=20作为关键字参数传入。注意,sex这个关键字参数如果不传入的话,会使用函数定义时指定的默认值male。
-
解包数组
-
号还可以用于解包数组,示例如下:
a = [1, 2, 3]
print(*a)
上述示例代码中,a 是一个数组,使用 *a 就可以将数组解包成独立的参数,等同于输入 1, 2, 3。
- 解包字典
** 号同样可以用于解包字典,示例如下:
a = {'name': '李白', 'age': 30}
print(**a)
上述示例代码中,a 是一个字典,使用 **a 就可以将字典解包成关键字参数,等同于输入 name=’李白’, age=30。
总的来说,与*运算符是Python函数参数中常用的两个运算符,对于编写灵活的函数非常有用。