Python函数参数中的*与**运算符

  • Post category:Python

函数参数中的运算符是Python中常用的两个运算符,主要用于函数的参数传递。其中号表示解包,**号表示解包键值对。

  1. 解包

在函数定义时,如果在参数前加上*,那么表示这些参数将会作为元组(tuple)传入函数并被解包:

def foo(*args):
    for arg in args:
        print(arg)

foo(1, 2, 3)

上面代码中,foo函数的参数前使用了*,这样传入的1, 2, 3就被放进了一个元组args里面。然后我们就可以使用for循环遍历这个元组并打印出每个元素的值。

  1. 解包键值对

在函数定义时,如果在参数前加上**,那么表示这些参数将会作为字典(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循环遍历这个字典并打印出每个键值对的键和值。

  1. 解包与其他参数类型混用

在函数定义时,*也可以和其他参数类型一起使用,但是要注意顺序。一般来说,顺序应该是位置参数、可变参数、关键字参数和命名关键字参数。

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。

  1. 解包数组

  2. 号还可以用于解包数组,示例如下:

a = [1, 2, 3]
print(*a)

上述示例代码中,a 是一个数组,使用 *a 就可以将数组解包成独立的参数,等同于输入 1, 2, 3。

  1. 解包字典

** 号同样可以用于解包字典,示例如下:

a = {'name': '李白', 'age': 30}
print(**a)

上述示例代码中,a 是一个字典,使用 **a 就可以将字典解包成关键字参数,等同于输入 name=’李白’, age=30。

总的来说,*运算符是Python函数参数中常用的两个运算符,对于编写灵活的函数非常有用。