• python 函数中参数列表的 *,**,/ 是什么意思?


    基本参数传递要求:

    当给一个函数传递参数时,如果其中一个使用了关键字参数传参,则在该参数后必须都是关键字参数,在第一个关键字参数之前,都是以位置参数传参。

    def test(a, b, c, d):
        print(a, b, c, d)
    
        
    # 错误示范,在b=2之后,都必须是关键字穿参,不然后面的参数无法知道对应到列表中那个参数
    # test(1, b=2, 3, 4)
    

    / 符号作为占位符的作用

    / 符号之前的所有参数,都必须以位置参数穿参,不可以关键字参数传参

    def test2(a, /, b, c, d):
        print(a, b, c, d)
    
    
    # 错误示范
    test2(a=0, b=1, c=3, d=4)
    # 正确示范,a不可根据关键字方式传参
    test2(0, b=1, c=3, d=4)
    

    * 符号作为占位符的作用

    *** 符号之后的所有参数,都必须以关键字方式传参,不得以位置方式传参**

    def test3(a, b, *, c, d):
        print(a, b, c, d)
    
    
    # 错误示范
    test3(0, 1, 3, d=4)
    # 正确示范,c不可根据位置方式传参
    test3(0, 1, c=3, d=4)
    

    总结:

    • 在 * 号之后 => 关键字参数传参
    • 在 / 号之前 => 位置参数传参
    • 如果 * 出现在 / 之前,会报错,因为在 * 和 / 之间存在矛盾
    # 错误定义 SyntaxError: invalid syntax /
    def test5(a, *, b, /, c, d):
        print(a, b, c, d)
    
    def test4(a, /, b, *, c, d):
        print(a, b, c, d)
    
    
    # 错误示范
    test4(0, 1, 3, d=4)
    # 正确示范,b位置不作限制
    test4(0, b=1, c=3, d=4)
    

    在参数的前面带有 * , ** 的作用

    有时候会发现有些函数中,某些参数前面带有 * 或者 **,* 表示该参数是一个数组,** 表示该参数是一个字典。

    def test6(a, b, *c, d):
        print(a, b, c, d)
    
    
    # *c 之前的 a b 都是位置参数,从 3 开始以后都是 *c,关键字 d=4 才是给 d 赋值
    test6(1, 2, 3, 4, 5, 6, d=4)  # 1 2 (3, 4, 5, 6) 4
    
    def test7(a, b, c, **d):
        print(a, b, c, d)
    
    
    # 注意:后面的 e=5, r=4 的 key 不得和前面的关键字重复
    test7(1, 2, 3, e=5, r=4)  # 1 2 3 {'e': 5, 'r': 4}
    
    def test8(a, *b, c, **d):
        print(a, b, c, d)
    
    
    # a 是位置参数,*b 是列表,c 是关键字参数,**d 是字典参数
    test8(1, 2, 3, c=0, e=5, r=4)  # 1 (2, 3) 0 {'e': 5, 'r': 4}
    
  • 相关阅读:
    Docker学习笔记
    Docker学习笔记
    Docker学习笔记
    Docker学习笔记
    Docker学习笔记
    第二类斯特灵数学习笔记
    浅谈"n个球"和"m个盒子"之间的乱伦关系
    cf932E. Team Work(第二类斯特灵数 组合数)
    [vijos]lxhgww的奇思妙想(长链剖分)
    BZOJ2054: 疯狂的馒头(并查集)
  • 原文地址:https://www.cnblogs.com/sun2020/p/14940480.html
Copyright © 2020-2023  润新知