当前位置 博文首页 > Python函数参数中的*与**运算符

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

    作者:12345611654123 时间:2021-05-02 17:47

    问题描述

    在阅读某些代码时,经常会看到函数定义/调用时的参数前带有 * 或者 ** 运算符,比较糊涂,今天来探究记录一番.

    函数定义时的 * 和 **

    查阅相关资料得知,在参数前面加上* 号 ,意味着参数个数不止一个,而带一个星号(*)参数的函数传入的参数存储为一个元组(tuple),带两个(*)号则是表示字典(dict)!

    我们定义3个函数来分别测试一下*和**的功能。

    第一个函数func1参数列表中有两个参数,其中参数b前有*
    第二个函数func2参数列表中有两个参数,其中参数b前有**
    第三个函数func3参数列表中有三个参数,第二个参数前有*,第三个参数前有**

    def func1(a, *b):
      print(a)
      print(b)
      
    def func2(a, **b):
      print(a)
      print(b)
      
    def func3(a, *b, **c):
      print(a)
      print(b)
      print(c)
    

    然后我们进行参数传入

    func1(1, 2, 3, 4)
    print("---"*24)
    func2(1, x=1, y=2)
    print("---"*24)
    func3(1, 2, 3, 4, x=5, y=6)
    

    打印结果为:

    $python3 main.py
     
    (2, 3, 4)
    ------------------------------------------------------------------------
    1
    {'x': 1, 'y': 2}
    ------------------------------------------------------------------------
    1
    (2, 3, 4)
    {'x': 5, 'y': 6}

    可以看到,第一个函数将多余1个的后续参数全部以元组形式赋值给了带*参数b,第二个函数则将多余参数以字典形式赋值给了带**参数b,当*和**同时存在时,一个星号(*)参数的函数传入的参数存储为一个元组(tuple),带两个(*)号则是表示字典(dict)。

    如果这里我们不使用赋值形式传入参数来调用func2时,程序则会报错,例如

    func2(1, 2, 3, 4)
    print("---"*24)
    

    将会有如下报错信息:

    Traceback (most recent call last):
      File "main.py", line 18, in <module>
        func2(1, 2, 3, 4)
    TypeError: func2() takes 1 positional argument but 4 were given

    *和**调用时的作用

    在调用时,*主要是用来解压参数列表,对于set、tuple、list、dict(会取其values的值)类型的数据都适用。实验代码如下:

    def func4(a, b):
      print(a)
      print(b)
    
    params_set = (1, 2)
    params_tuple = (1, 2)
    params_list = [1, 2]
    params_dict = {
      "a": 1,
      "b": 2
    }
    
    

    我们使用*参数方式对其分别进行调用

    print("***"*24)
    func4(*params_set)
    print("***"*24)
    func4(*params_tuple)
    print("***"*24)
    func4(*params_list)
    print("***"*24)
    func4(*params_dict)
    print("***"*24)
    

    打印结果如下:

    ************************************************************************
    1
    2
    ************************************************************************
    1
    2
    ************************************************************************
    1
    2
    ************************************************************************
    a
    b
    ************************************************************************

     可以看到,*将参数按顺序一一赋值(set并无顺序,因此盲猜结果是随机的,未实验验证),而dict类型则是将字典的keys作为函数参数进行赋值。

    **参数方式则要求输入必须是一个dict,而且变量名称要与函数定义的变量名称一致,实验代码如下:

    params_dict1 = {
      "a": 1,
      "b": 2
    }
    params_dict2 = {
      "x": 1,
      "y": 2
    }
    
    print("---"*24)
    func4(**params_dict1)
    print("---"*24)
    func4(**params_dict2)

    打印结果如下:

    ------------------------------------------------------------------------
    1
    2
    ------------------------------------------------------------------------
    Traceback (most recent call last):
      File "main.py", line 57, in <module>
        func4(**params_dict2)
    TypeError: func4() got an unexpected keyword argument 'x'

    可以看到,当变量名称与函数定义的变量名称不一致时,程序会报错

    参考

    Python函数中参数前带*和**是什么意思?
    Execute Python-3 Online (Python v3.6.2),

    js
    下一篇:没有了