Python函数之*[参数名]和**[参数名]的用处

news/2024/10/4 9:23:55

一、*[参数名]

调用

合法调用

普通调用

*参数名一般写成*args, 如:

def func(*args):print(args)

可以试着调用func

>>> func(1)
(1,)
>>> func()
()
>>> func(1, 2, 3)
(1, 2, 3)
>>> func(dict(), set(), str(), int())
({}, set(), '', 0)

所以,我们发现,这样的函数可以传任意个参数(包括0),*会把参数打包成一个tuple,如(1,) () (1, 2, 3) ({}, set(), '', 0)

特殊调用

如果已经有一个tuple对象,想传进去作为args呢?
首先定义一个tuple对象:

>>> tuple_object = (1, 2, 3)
>>> print(tuple_object)
(1, 2, 3)
错误方法

一般想到的都是这样的方法:

>>> func(tuple_object)
((1, 2, 3),)

((1, 2, 3),)? 不应该是(1, 2, 3)吗?
因为系统把它识别为一个args中的参数,所以args就是“tuple中有tuple”,不对。OH NO!

正确方法

tuple_object前面打个*,OK:

>>> func(*tuple_object)
(1, 2, 3)

这就是“解包”。

非法调用

如果调用func(a=1, b=2)呢?请看:

>>> func(a=1, b=2)

得到TypeError:

Traceback (most recent call last):File "<*args test file>", line 1, in <module>func(a=1, b=2)
TypeError: func() got an unexpected keyword argument 'a'

错误中,keyword argument是什么?

  • keyword argument是像a=1 b=2 c='Hi'这样的传参形式。
  • 简单地说,keyword argument就是name=value形式的传参。

所以,应该用value形式的传参(英文是positional argument),而不应该使用name=value的传参。

默认参数

*[参数名]的参数不能有默认参数:
尝试设置默认参数失败图

如上图,尝试设置默认参数会报SyntaxError,如果真要设置默认参数,应该用一种类似“手动设置默认值”的办法:

# 手动设置*args的参数默认值
DEFAULT_VALUE = (1, 2, 3) # 默认值,可自行改变
def func(*args):if args == (): # 如果为空(用户没有传递参数):args = DEFAULT_VALUE # 设为默认值print(args)

这样,就有默认值了:

>>> func() # 无参数调用
(1, 2, 3)

总结

  • *[参数名]表示应使用value形式传参,参数个数不限,传入后会打包成tuple,供函数体使用。
  • 特殊传参方法:*[tuple object]
  • 这种方法不能设置默认值,只能用“手动设置默认值”。

二、**[参数名]

调用

合法调用

普通调用

**参数名一般写成**kwargs, 如:

def func(**kwargs): # kwargs = keyword argumentsprint(kwargs)

然后调用func,但是这个跟上一个相反,必须是name=value式传参 (这也是为什么它叫kwargs (keyword arguments)):

>>> func(a=1, b=2, c=3, d=4)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> func(_tuple_obj=tuple(), _set_obj=set(), _dict_obj=dict())
{'_tuple_obj': (), '_set_obj': set(), '_dict_obj': {}}
>>> func()
{}

这样的函数可以传任意个keyword argument(包括0),这里也与上一个相反,会把参数打包成一个dict,如{'a': 1, 'b': 2, 'c': 3, 'd': 4} {'_tuple_obj': (), '_set_obj': set(), '_dict_obj': {}} {}

特殊调用

如果已经有一个dict对象,想传进去作为kwargs呢?
首先定义一个这样的对象:

>>> dict_object = {'a': 666, 'b': 888}
>>> print(dict_object)
{'a': 666, 'b': 888}

然后,跟上次相似:

>>> func(dict_object) # 因为不能传positional argument, 这下还报错了(马上会讲到):
Traceback (most recent call last):File "<**kwargs test program>", line 1, in <module>func(dict_object)
TypeError: func() takes 0 positional arguments but 1 was given
>>> func(**dict_object) # 正确方法
{'a': 666, 'b': 888}

非法调用

如果传递positional argument呢?请看:

>>> func(1, 2)

得到TypeError:

Traceback (most recent call last):File "<**kwargs test program>", line 1, in <module>func(1, 2)
TypeError: func() takes 0 positional arguments but 2 were given

所以,这里应该用key=value形式的传参(英文是keyword argument),而不应该使用value的传参方法。

默认参数

*args的方法类似,应该用手动设置默认值”的方法:

# 手动设置**kwargs的参数默认值
DEFAULT_VALUE = {'a': 1, 'b': 2} # 默认值,可自行改变
def func(**kwargs):if kwargs == {}: # 如果为空(用户没有传递参数):kwargs = DEFAULT_VALUE # 设为默认值print(kwargs)

这样,就有默认值了:

>>> func() # 无参数调用
{'a': 1, 'b': 2}

总结

  • **[参数名]表示应使用key=value形式传参,参数个数不限,传入后会打包成dict
  • 特殊传参方法:**[dict object]
  • 这种方法不能设置默认值,也只能用“手动设置默认值”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/58059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

discuz3.4文件包含漏洞

首先查看修复:可以看到新增代码preg_match("/^[\w-]+\.php$/i", $parse[path])) 来验证path是否为php文件,这个应该是修复路径遍历导致的文件读取漏洞。还有require ./.$_ENV[curapp]..php;这里应该是另外一个漏洞,因为$parse[path]和$_ENV[curapp]没有关联。 然后…

web 开发(4)- 数据库sql

sql创建数据库sudo mysql 进入 mysql> create database book_01安装 mysqlclient sudo apt-get install libmysqlclient-dev sudo apt-get update 远程控制SQL得到远程密码 sudo cat /etc/mysql/debian.cnf 获取IP地址 ifconfig sudo mysql 问题一,不允许远程控制 先进入本…

隧道视频监控智能分析系统

隧道视频监控智能分析系统是道路交通方式不可缺少的监管手段,隧道视频监控智能分析系统有效进行交通违法和紧急事件的全自动识别和交通出行流量的全自动数据分析,并依据城市路口、城市道路、高速路、道路、公安机关监控、隧道、公路桥梁、地下停车场等各类实际路面生态环境开…

煤矿皮带急停报警监测系统 煤矿皮带运行监控系统

煤矿皮带急停报警监测系统运用煤矿地底现场已有摄像头的视频监控画面图像,赋能现场传统摄像机具备Ai识别分析报警、监管和鉴别工作人员、机器设备、自然环境等使用标准、皮带锚索、煤矸石砖、堆煤、非法运输等异常现象、工作人员没戴安全头盔、擅自离岗、路面浓烟、水、影片等…

个人项目-论文查重

这个作业属于哪个课程 班级链接这个作业要求在哪里 个人项目 - 作业 - 计科22级12班 - 班级博客 - 博客园 (cnblogs.com)这个作业的目标 准备、创建、开发、管理、测试个人项目GitHub项目链接 https://github.com/chocohQL/3122004348-01 可运行 jar 已发布在最新 releases 项目…

加油站视频监控智能识别分析

加油站视频监控智能识别分析根据AI视频识别的加油站智能监控解决方案:依据加油站现场已经存在的高清摄像头搜集加油站视频在此基础上加油站视频监控智能识别加油站监控画面中的人的行为或者车的视频图象。智能识别工作人员行为状态,是否存在违规操作,系统自动识别员工,不戴…

Windows NoiLinux

在 Windows 下使用 NoiLinux ubuntu-noi-v2.0.iso下载 ubuntu-noi-v2.0.iso打开 VMWare,创建新的虚拟机 -> 自定义(高级)-> 下一步 -> 下一步 -> 安装程序光盘映像文件(iso),选择下载的 ubuntu-noi-v2.0.iso后面直接跳过就行了,可能需要你留意的是分配处理器内…

通用加工软件 PowerNC

可以取代维宏的NCStudio软件 除了支持标准NC文件外,还可以集成一个CAM软件;