°

python函数中带星号*的参数*args和**kwargs

2019年课程规划及价格说明


PHP实战视频教程大全

在python的学习和使用过程当中,我们会遇到这样的情形,在声明函数的时候,在函数的参数前加一个星号*或是两个星号**的情况,大多学员不太理解*的意思,比如:

def staff_info(a,b,*c):

     pass

再比如:

def stud_info(*args, **kwargs):

      print(args)

      print(kwargs)

我们声明此类带有星号*的函数的时候,函数形参名称默认使用args和kwargs不是必须,但是这是一个默认的规则,这样大家都能看懂,可以提高代码的可读性。

那么其中的星号*到底有什么作用呢?其实很简单,它只是:允许我们接收非固定数量的位置参数(positional arguments)或关键词参数(keyword arguments),换句话说,这种参数就是用来处理参数数量不确定的情况的。

下面我们来尝试调用执行该函数:

stud_info(‘shuxue’, ‘yingyue’, ‘yuwen’, ‘name’=’tongpan’,’age’=28)

从上面的函数调用时候传递的参数我们可以分为两类,参数前面带名称的和参数前面不带名称的两种参数,在该函数中,不带名称的参数(即:位置参数),如:’shuxue’, ‘yingyue’, ‘yuwen’会被*args接收到,并组合为一个元组,带名称的参数(即:关键字参数): ‘name’=’tongpan’,’age’=28则会被**args捕获到,组合为一个dict字典,其执行结果为:

print(args):

(‘shuxue’, ‘yingyue’, ‘yuwen’)

print(kwargs):

{ ‘name’:’tongpan’, ‘age’:28}

得到元组和字典后,我们就可以根据元组和字典的特点对他们进行分别操作了。

有时候我们在调用函数的时候也会在参数前面传入一个星号*或者两个星号**,在这样的情形下,参数则会被拆分为一个序列或是字典,然后再分别传入函数内部。

我们来举例证实一下:

声明一个list数组: kecheng = [‘math’, ‘art’, ‘english’]

声明一个字典:info = { ‘name’:’tongpan’, ‘age’:28}

现在我们将两者作为参数传入:stud_info(kecheng, info)

我们的本意可能是kecheng参数作为位置参数,info作为关键词参数,但是如果我们这样传入的话,结果和我们预想的就不一样了:

第一个打印输出:([‘math’, ‘art’, ‘english’], { ‘name’:’tongpan’, ‘age’:28})

第二个打印输出:{}

也就是说我们的函数把两个参数,kecheng和info都当做了位置参数

为了得到预想的元组和字典,正确的调用方法应该是这样,在对应的参数前面加上*:

stud_info(*kecheng, **info)  一个星号说明是:位置参数  两个星号说明是:关键词参数

执行结果:

第一个打印输出:(‘math’, ‘art’, ‘english’)

第二个打印输出:{ ‘name’:’tongpan’, ‘age’:28}

打赏
  喜欢