首页 > 编程语言 >Python函数之*[参数名]和**[参数名]的用处

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

时间:2024-09-08 20:38:14浏览次数:11  
标签:tuple Python args 参数 func dict 默认值 用处

一、*[参数名]

调用

合法调用

普通调用

*参数名一般写成*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 arguments
	print(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]
  • 这种方法不能设置默认值,也只能用“手动设置默认值”。

标签:tuple,Python,args,参数,func,dict,默认值,用处
From: https://www.cnblogs.com/stanleys/p/18403386/python-functions-argpack

相关文章

  • 手撕Python之序列类型
    1.列表---list索引的使用当我们有一个数据的时候,我们怎么将这个数据存储到程序呢?我们定义一个变量,将数据存储在变量中那么如果有100个数据呢?要定义100个变量吗?我们是可以用列表这个东西进行多个数据的存放列表的定义:[]空列表:[]列表:[元素1,元素2,元素3]列表中的内容......
  • python+flask计算机毕业设计基于web点餐小程序的个性化推荐(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,餐饮业与信息技术的深度融合已成为不可逆转的趋势。特别是在后疫情时代,线上点餐服务因其便捷性、安全性受到了广......
  • python+flask计算机毕业设计基于web技术的课程思政元素信息交流平台的设计与探索(程序+
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在高等教育日益重视课程思政建设的背景下,如何将思想政治教育有机融入专业课程,提升学生思想政治素质,成为当前教育改革的重要课题。随着互联......
  • python+flask计算机毕业设计基于单片机及spring框架的高血压患者居家监测系统(程序+开
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快和人口老龄化趋势的加剧,高血压作为一种常见的慢性疾病,其发病率逐年上升,已成为影响公众健康的重要因素之一。传......
  • python+flask计算机毕业设计基于弹幕视频的在线教学系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着前所未有的变革。在线教学作为一种新兴的教学模式,凭借其跨越时空限制、资源丰富多样等优势,逐渐......
  • python文件处理笔记(1)
    1、open(文件名(通常是.txt),模式,encoding=模式)文件名通常是.txt,不然要做预处理(encoding的模式通常用utf-8)模式通常分为3种:①只读模式 'r'f=open('文件.txt','r',encoding='utf-8')这个模式只能读取文件内容②追加模式 'a'可以在文档后面增加内容f=open('......
  • python实现列表操作
    在python中,列表和数组的区别:列表(List):可以包含不同数据类型的元素,有许多内置方法,如 append()、remove() 等。数组(Array):通常用于描述固定大小的连续存储空间,所有元素通常必须是相同的数据类型,长度不可变。对于数值计算,通常比列表更高效,因为内存存储和访问更优化,提供特定于数......
  • 基于python+flask框架的基于web的购物商城系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为全球经济的重要组成部分,深刻改变了人们的消费习惯与商业模式。购物商城作为电子商务的核心表现形......
  • 基于python+flask框架的献血管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会文明与医疗技术的不断进步,无偿献血已成为保障临床用血安全、缓解血源紧张的重要途径。然而,传统的献血管理模式往往存在信息不对称......
  • 基于python+flask框架的流浪猫救助平台(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,流浪猫问题日益凸显,成为城市生态与人文关怀的一大挑战。这些无家可归的小生命,不仅面临着食物短缺、生存环境恶劣的困......