python中形参*args和**args的区别

1.args的介绍和基本使用方法

在定义方法的时候python提供了两种形式参量*args和**args,这两种形参给予了python在调用函数的时候具有极大的便利,在编程的时候可以更加灵活,我们拿pyqtgraph的plot方法为例

def plot(*args, **kargs):
    """
    Create and return a :class:`PlotWindow <pyqtgraph.PlotWindow>` 
    (this is just a window with :class:`PlotWidget <pyqtgraph.PlotWidget>` inside), plot data in it.
    Accepts a *title* argument to set the title of the window.
    All other arguments are used to plot data. (see :func:`PlotItem.plot() <pyqtgraph.PlotItem.plot>`)
    """
    mkQApp()
    #if 'title' in kargs:
        #w = PlotWindow(title=kargs['title'])
        #del kargs['title']
    #else:
        #w = PlotWindow()
    #if len(args)+len(kargs) > 0:
        #w.plot(*args, **kargs)
        
    pwArgList = ['title', 'labels', 'name', 'left', 'right', 'top', 'bottom', 'background']
    pwArgs = {}
    dataArgs = {}
    for k in kargs:
        if k in pwArgList:
            pwArgs[k] = kargs[k]
        else:
            dataArgs[k] = kargs[k]
        
    w = PlotWindow(**pwArgs)
    w.sigClosed.connect(_plotWindowClosed)
    if len(args) > 0 or len(dataArgs) > 0:
        w.plot(*args, **dataArgs)
    plots.append(w)
    w.show()
    return w

在这里插入图片描述

从上图中可以看到plot方法将形参kargs当做一个字典来使用,那么它的底层是怎么到底是什么的样的呢?

让我们先来测试*args

def method1(a,b,c,*args):
    print("a=",a)
    print("b=",b)
    print("c=",c)
    print("*agrs=",args)

调用该方法

    method1(1,2,3,4,5)
    '''
    output
    a= 1
    b= 2
    c= 3
    *agrs= (4, 5)
    '''

可以看到*args用于接收除了形参以外多余的参数,这意味着,如果函数里面有普通变量的形参,*args不可以放在这些普通变量的前面!!

def method1(*args,a,b,c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
    print("*agrs=",args)

如果运行上述代码,就会报错
在这里插入图片描述
让我们再来看看**agrs的功能

def method2(a,b,**args2):
    print("a=", a)
    print("b=", b)
    print("*agrs2=", args2)


    method2(11, 22,name="jack")
    '''
    a= 11
    b= 22
    *agrs2= {'name': 'jack'}
    '''

这说明**args形参储存的是字典,以字典的形式保存,这也就是为了文章开头的时候我们看到plot方法用了for in 遍历

让我们结合*args和**agrs使用

def method2(a,b,*args1,**args2):
    print("a=", a)
    print("b=", b)
    print("*agrs1=", args1)
    print("*agrs2=", args2)

    method2(1, 2, 3, 4, 5,name="jack")
    '''
    a= 1
    b= 2
    *agrs1= (3, 4, 5)
    *agrs2= {'name': 'jack'}
    '''

注意:这里的*args和**agrs的顺序不可以颠倒,否则直接在coding阶段报错
在这里插入图片描述

需要注意的是:形参中的*args或者**args中args变量满足标识符命名规范,可以定义自己需要的变量名

2.args形参在构造方法中的运用
**args可以传递键值对,根据这个原理,我们可以运用args给一个类的构造方法传参,这样子就能往构造方法中任意传参数进去,再运用字典的get()方法来调用,更具灵活性

class person:
    def __init__(self,**agrs):
        print("调用了初始化方法")
        self.name = agrs.get("name")
        self.age =agrs.get("age")
        self.printMessage()

    def printMessage(self):
        print(self.age)
        print(self.name)


zhangsan =person(name="小明",age="18")
jack = person(name="jack")

版权声明:本文为linZinan_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。