千家信息网

怎么使用python不定长参数*args和**kwargs

发表于:2024-06-16 作者:千家信息网编辑
千家信息网最后更新 2024年06月16日,本篇内容主要讲解"怎么使用python不定长参数*args和**kwargs",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么使用python不定长参数*
千家信息网最后更新 2024年06月16日怎么使用python不定长参数*args和**kwargs

本篇内容主要讲解"怎么使用python不定长参数*args和**kwargs",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么使用python不定长参数*args和**kwargs"吧!

在python语言写成的模块中的函数里,常常可以看到函数的参数表列里面有这两个参数,形如:

def some_function(*args, **kwargs):    to do list    return 0

首先,解释星号的作用,一个星号*的作用是将tuple或者list中的元素进行unpack,分开传入,作为多个参数;两个星号**的作用是把dict类型的数据作为参数传入。

kwargs是keyword argument的缩写,args就是argument。我们知道,在Python中有两种参数,一种叫位置参数(positional argument),一种叫关键词参数(keyword argument),关键词参数只需要用 keyword = somekey 的方法即可传参,而位置参数只能由参数位置决定。这也就决定了位置参数一定要在前面,否则关键词参数数量的变化(比如有些kwargs有默认值因此没有传参或者在后面传参的),都会使得位置无法判断。因此常见的也是*args**kwargs 前面。

题目描述:

1、怎么理解不定长参数?
2、*args**kwargs 是什么意思?为什么要使用它们?

答案要点如下:

1、函数参数可为分如下几种:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

2、当我们在定义和调用一个函数时,如果包含所有的参数类型,则必须按照:必选参数、默认参数、可变参数、命名关键字参数和关键字参数的顺序。但是在实际开发中,不建议包含过多的参数类型,会影响代码的可读性

3、必选参数很简单,就是函数中必须要接受的参数

4、默认参数,即给参数赋一个默认值,我们在传递时,可省略对该参数的传值操作。如:

def print_test(title, msg="world"):    print(title, msg)print_test("hello") # hello worldprint_test("hello", "demon") # hello demonprint_test("hello", msg="demon") # hello demon# 错误调用示例# print_test( msg="demon","hello") # 这样是不对的

5、可变参数,在定义函数是用 *args 来接受,其中 * 是规定的,args可用其他名称替换,但一般习惯用 args 来表示。可变参数在传入函数后,被封装成一个 tuple 来进行使用。所以我们在函数内部,可以通过操作 tuple 的方法来操作参数,示例如下:

def print_numbers(*args):                print(type(args))  # tuple    for n in args:      print(type(n))   # intprint_numbers(1, 2, 3, 4)

6、如果在函数外已经得到一个 list 或者 tuple,想调用一个可变参数,也可以用 *+变量名 的形式进行调用,(这种用法有点类似 C语言 中的指针),示例如下:

def print_numbers(*args):                print(type(args))  # tuple    for n in args:      print(type(n))   # intl = [1, 2, 3, 4]print_numbers(*l)  # *l,等价于 print_numbers(1, 2, 3, 4)print_numbers(l)   # 将 l 作为一个整体传入,这样函数接受到的其实只有一个参数,且参数类型为 list

7、关键字参数使用 kwargs 来标识,是规定,而kwargs可替换,它将不定长参数转换为 dict 传入函数。它用于扩展函数的功能。比如我们要实现用户注册,有必输项和非必输项,这些非必输项就可以用关键字参数来接受。示例如下:

def register(name, email, **kwargs):    print('name:%s, age:%s, others:%s', (name, email, kwargs))register("demon", "1@1.com") # name:%s, age:%s, others:%s ('demon', '1@1.com', {})register("demon", "1@1.com", addr="shanghai") # name:%s, age:%s, others:%s ('demon', '1@1.com', {'addr': 'shanghai'})

8、如果函数外已经获得一个 dict ,想进行函数调用,只需用 **+变量名 传入即可。并且 dict示例如下:

def register(name, email, **kwargs):    print('name:%s, age:%s, others:%s', (name, email, kwargs))d = {"addr":"shanghai"}register("demon", "1@1.com", **d)d = {"name":"yrr", "email":"1@1.com", "addr":"shanghai"}register(**d)d = {"email":"yrr", "name":"1@1.com", "addr":"shanghai"}register(**d)

9、命名关键字参数用于限制调用函数可传入的属性。这里的限制是假限制,因为仍然可以传入,只是函数体中对限制外的参数不作任何处理。命名关键字参数用一个 * 号分隔,* 后面的参数都被视为命名关键字参数。如:

def person(name, age, *, city, job):    print(name, age, city, job)

10、如果函数中已经有了一个可变参数的定义,后面的命名关键字参数则不需要再添加 * ,如:

def person(name, age, *args, city, job):    print(name, age, args, city, job)

11、关键字参数和命名关键字参数在调用时必须用 key=value 的形式来调用,这类参数我们称之类名称参数,而不需要指定参数名称的参数,也称为位置参数。必输参数和可变参数都可以通过位置参数来匹配。如:

def register(name, email, **kwargs):    print('name:%s, age:%s, others:%s', (name, email, kwargs))# 错误调用:register("123","123","123")# 它会把第三个参数 "123">

12、最后一个比较特殊,也是一个结论:对于任意函数,都可以通过func_name(*args, **kw)的形式来进行调用其中 args 是一个已经获得的列表或者元组,而 kw 是一个已经获得的字典。列表传入会按顺序对必输参数赋值,多余的参数会当成可变参数传入,而字典传入会根据 key 来匹配所有参数。如:

def test1(a, b, c=0, *args, **kwargs):    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kwargs)def test2(a, b, c=0, *args, d, **kwargs):    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'args=', args, 'kw =', kwargs)# 定义一个元组和字典用作参数传入args = (1, 2, 3, 4)kw = {'d': 99, 'x': '#'}test1(*args, **kw)# a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}test2(*args, **kw)a = 1 b = 2 c = 3 d = 99 args= (4,) kw = {'x': '#'}

到此,相信大家对"怎么使用python不定长参数*args和**kwargs"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

参数 函数 关键 关键字 可变 位置 示例 类型 限制 作用 关键词 可以通过 名称 字典 形式 方法 星号 两个 内容 变量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手机网络安全密钥怎么找回 网络安全大检查新闻稿 数据库导出sql文件应该有多大 湖南智能软件开发价格 网站数据库的修改 厦门应用软件开发公司排名 信息系统集成能做软件开发吗 全国网络安全内容 计算安全容器服务器 数据库汇总选项不见了 服务器程序经常未响应 崇明区专业型数据库销售代理品牌 建立数据库文字描述 魅蓝网络技术服务 7.0采集助手数据库 阿里云服务器安全组怎么设置 内蒙古推广软件开发资格 sql数据库不见了 开创网络技术有限公司 腾讯服务器保存了qq记录吗 我的世界服务器小游戏枪王之战 好用的数据库开发 青山区海航网络安全维护怎么样 山西学生少儿编程平台软件开发 安徽hp服务器阵列卡安装 教育通讯稿网络安全 博雅数据库预估湖南文科 计算机网络安全措施调查问卷 智能驾驶数据库 数据库查找用户空指针
0