【python小课堂专栏】python小课堂38 - 关于 *args,**kwargs 的作用

python小课堂38 - 关于 *args,**kwargs 的作用

前言

有时在看在大神写的程序中,会看见 *args,**kwargs 这样的写法,那么你知道,这样写法的含义是什么吗?

本篇用最简短的小示例来介绍下它们的用法,以及这样写的好处。

*args 用法

*args:可以理解为多个无名参数,也有人叫可变位置参数的。

示例1,定义一个打印的函数,传入任意参数即可:

def print_func(*args):
    print(type(args))
    print(args)

print_func(1, 2, '呵呵哒', [])

在这里插入图片描述

打印 args 的类型是一个元组。直接对此变量打印输出,可以看到虽然我们以正常的多个参数传入,但是用到 args 时,将外界参数以元组形式呈现出来。

示例2 ,在打印函数中的参数处,新增 x 和 y 变量。


def print_func(x, y, *args):
    print(type(x))
    print(x)
    print(y)
    print(type(args))
    print(args)

print_func(1, 2, '呵呵哒', [])

在这里插入图片描述

若在函数参数定义处,有多个实体变量,它会按照顺序一一将传入的参数对应上,就像上面的例子,1传入对应就是x,2传入就是y,其余的参数对应 *args 。

示例3,若要是将 *args 放在参数最前面,颠倒顺序会如何?


def print_func(*args, x, y):
    print(type(x))
    print(x)
    print(y)
    print(type(args))
    print(args)

print_func(1, 2, '呵呵哒', [])

在这里插入图片描述

可以看到,报错了,错误信息,提示找不到关键词参数 x,y。

所以若 *args不是在最后,则需要在参数传入时,明确定义 *args后面的变量参数名,如下:


def print_func(*args, x, y):
    print(type(x))
    print(x)
    print(y)
    print(type(args))
    print(args)

print_func(1, 2, '呵呵哒', [], x='x', y='y')

在这里插入图片描述

上面分别介绍了:

  1. (x,y,*args) 顺序

  2. (*args,x,y) 顺序

其实还有第三种顺序,就是放在中间,至于结果怎样?可以自行尝试,留个小小的悬念,多多动手才能学到东西,哈哈哈。

**kwargs 用法

**kwargs:多个关键词参数。

示例1:


def print_func(**kwargs):
    print(type(kwargs))
    print(kwargs)

print_func(1, 2, '呵呵哒', [])

在这里插入图片描述

直接报错了,大致意思是需要给出四个参数!

改下调用函数时的入参:


def print_func(**kwargs):
    print(type(kwargs))
    print(kwargs)

print_func(a=1, b=2, c='呵呵哒', d=[])

在这里插入图片描述

入参时,多添加了关键词。可以看到打印时,kwargs本身是字典类型,将传入的参数以字典形式呈现出来。

组合使用

arg,*args,**kwargs,三者是可以组合使用的,但是组合使用需要遵循一定的语法规则,即顺序为王。

需要按照:

arg,*args,**kwargs作为函数参数的顺序。

def print_func(x, *args, **kwargs):
    print(x)
    print(args)
    print(kwargs)

print_func(1, 2, 3, 4, y=1, a=2, b=3, c=4)

在这里插入图片描述

可以看到按照顺序,依次进行解析打印。若不按照顺序,可自行尝试,会报错的哟!

优点

首先说明一点用 *args 和 **kwargs只是为了方便并没有强制使用它们。使用这两个得好处就是使得代码非常灵活。

当你不确定你的函数里将要传递多少参数时你可以用*args,就像上面的示例中一样,它可以传递任意数量的参数。**kwargs允许你使用没有事先定义的参数名。

你不知道的小知识点

调用函数时你也可以用***语法.例如:

def print_func(a, b, c):
    print(f'a = {a}, b = {b}, c = {c}')

animal_list = ['pig', 'dog', 'cat']
print_func(*animal_list)

在这里插入图片描述

正如结果显示,它可以传递列表(或者元组)的每一项并把它们解包。

注意:入参时必须与它们在函数里的参数个数相吻合,所以你可以在函数调用时用*。

同理,**也是相似的:


def print_func(a, b, c):
    print(f'a : {a}, b : {b}, c : {c}')

animal_dict = {'a': 'pig', 'b': 'dog', 'c': 'cat'}
print_func(**animal_dict)

在这里插入图片描述

需要注意:定义的 animal_dict 中,key 必须等于调用函数中的变量关键词,否则会报错!

在这里插入图片描述

总结

本想着,介绍此篇应该会很短的内容,没想到写着写着又这么多了,总之相信下次再看见 * 和 **的你,应该不会有逃避心理了!

文章首发公众号,感兴趣的同学欢迎关注:migezatan(咪哥杂谈)。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页