• python中的*args和**kwargs


    多个实参,放到一个元祖里面,以*开头,可以传多个参数;**是形参中按照关键字传参把多余的传值以字典的方式呈现。

    一、*args

    介绍:表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现

    示例代码

    def foo(x,*args):
        print(x)
        print(args)
    foo(1,2,3,4,5,6)  #其中的2,3,4,5,6都给了args 

    执行结果

    :当arg与位置参数和默认参数混用的情况下(注意三者的顺序)

    示例一:三者顺序是:位置参数、默认参数、*args

    def foo(x, y=1, *args):
        print(x)
        print(y)
        print(args)
    
    foo(1, 2, 3, 4, 5)  # 其中的x为1,y=1的值被2重置了,3,4,5都给了args 

    执行结果

    1
    2
    (3, 4, 5) 

    示例二

    def foo(x,*args,y=1):
        print(x)
        print(args)
        print(y)
    
    foo(1,2,3,4,5)#其中的x为1,2,3,4,5都给了args,y按照默认参数依旧为1  

    执行结果

    1
    
    (2, 3, 4, 5)
    
    1
    

    其中关于*,可以从2个角度来看(需要拆分来看):  

    1、从形参的角度来看:

    def foo(*args):#其实这一操作相当于def foo(a,b,c,d,e):
        print(args)
    foo(1,2,3,4,5)#其中的1,2,3,4,5都按照位置传值分别传给了a,b,c,d,e
    

    执行结果

    (1, 2, 3, 4, 5)
    

    2、从实参的角度来看:

      

    def foo(x,y,z):
        print(x)
        print(y)
        print(z)
    foo(*(1,2,3))#其中的*(1,2,3)拆开来看就是:foo(1,2,3),都按照位置传值分别传给了x,y,z 

    执行结果:

    1
    2
    3   

    二、**kwargs 

    介绍:表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现

    示例代码

    def foo(x,**kwargs):
        print(x)
        print(kwargs)
    
    foo(1,y=1,a=2,b=3,c=4)#将y=1,a=2,b=3,c=4以字典的方式给了kwargs  

    执行结果

    1
    {'y': 1, 'a': 2, 'b': 3, 'c': 4  

    关于**kwargs与位置参数、*args、默认参数混着用的问题:(注意顺序)

    位置参数、*args、**kwargs三者的顺序必须是位置参数、*args、**kwargs,不然就会报错

    示例一:

    def foo(x,*args,**kwargs):
        print(x)
        print(args)
        print(kwargs)
    
    foo(1,2,3,4,y=1,a=2,b=3,c=4)#将1传给了x,将2,3,4以元组方式传给了args,y=1,a=2,b=3,c=4以字典的方式给了kwargs 

    执行结果

    1
    (2, 3, 4)
    {'y': 1, 'a': 2, 'b': 3, 'c': 4}  

    示例二(错误示例-----顺序错误):

    def foo(x,**kwargs,*args):
        print(x)
        print(args)
        print(kwargs)
    
    foo(1,y=1,a=2,b=3,c=4,2,3,4)  

    执行结果

    SyntaxError: invalid syntax
    

     位置参数、默认参数、**kwargs三者的顺序必须是位置参数、默认参数、**kwargs,不然就会报错:

    示例三:

    def foo(x,y=1,**kwargs):
        print(x)
        print(y)
        print(kwargs)
    
    foo(1,a=2,b=3,c=4)#将1按照位置传值给x,y按照默认参数为1,a=2,b=3,c=4以字典的方式给了kwargs  

    执行结果

    1
    1
    {'a': 2, 'b': 3, 'c': 4}
    

    其中关于**,可以从2个角度来看(需要拆分来看):

    1、从形参的角度来看:

    示例:

    def foo(**kwargs):#其实就是相当于def foo(y,a,b,c)
        print(kwargs)
    
    foo(y=1,a=2,b=3,c=4) 

    执行结果

    {'y': 1, 'a': 2, 'b': 3, 'c': 4}  

    2、从实参的角度来看:

    示例一:

    def foo(a,b,c,d):
        print(a)
        print(b)
        print(c)
        print(d)
    
    foo(**{"a":2,"b":3,"c":4,"d":5})#**{"a":2,"b":3,"c":4,"d":5}是将字典里的每个值按照关键字传值的方式传给a,b,c,d  

    执行结果

    2
    3
    4
    5  

    示例二:

    def foo(a,b,c,d=1):
        print(a)
        print(b)
        print(c)
        print(d)
    
    foo(**{"a":2,"b":3,"c":4})#**{"a":2,"b":3,"c":4}是将字典里的每个值按照关键字传值的方式传给a,b,c;d依旧按照默认参数  

    执行结果

    2
    3
    4
    1
  • 相关阅读:
    AIZU 0005
    Android Studio 1.0 (稳定版) 完全攻略
    android studio中avd sdk路径
    vim强大探究之光标移动
    Android项目打第三方jar包
    Android导出jar包后的资源使用问题
    混淆Android JAR包的方法
    Layout_margn与padding的区别
    Android软件开发之盘点自定义View界面大合集(二)
    Android软件开发之盘点所有Dialog对话框大合集(一)
  • 原文地址:https://www.cnblogs.com/moning/p/8385676.html
Copyright © 2020-2023  润新知