python函数定义中形参特殊用法,形参前的星号是什么意思?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
在使用python
的各种函数的时候,大家一定会发现,函数的参数传递有好多种方式。那么,为什么有这么多种参数传递的方式呢?这就要从python
的函数定义中的参数定义来展开描述。
大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔的代码编程经验所学所想。本文描述python
中形参的几种用法,并且重点描述其中的形参前面使用了星号的用法,其中在形参前使用一个星号和使用两个星号有什么区别呢?本文测试环境:win10
,python@3.7.11
。
导读内容
本文涉及了元组tuple
和字典dict
的用法。参考文章:
这里就复习一下tuple
和dict
的定义方法:
_tuple = (1,)
_dict = {'name': '苏南大叔', 'age': 18}
print(_tuple,type(_tuple))
print(_dict,type(_dict))
输出内容:
(1,) <class 'tuple'>
{'name': '苏南大叔', 'age': 18} <class 'dict'>
还涉及了python
的两个星号的用法,参考文章:
这里还复习一下args
和kwargs
的用法:
def test(a1,*args,**kwargs):
print(args,args[0],type(args))
print(kwargs,kwargs["a2"],type(kwargs))
test("a","b","c",a2="a2")
输出内容:
('b', 'c') b <class 'tuple'>
{'a2': 'a2'} a2 <class 'dict'>
形参前单星号,强转为元组
def test(a, b, *c):
print(c, type(c)) # ("大","叔") <class 'tuple'>
test("苏", "南", "大", "叔")
使用一个星号装饰形参,来把剩余的参数,转换成了一个元组tuple
。
def test(a, b, *c, d):
print(c, type(c))
test("苏", "南", "大", "叔", d="博客") # ('大', '叔') <class 'tuple'>
这里如果没有显式的传递这个必出的d
参数的话,就会获得错误提示信息。
test("苏", "南", "大", "叔", "博客") # test() missing 1 required keyword-only argument: 'd'
形参前双星号,强转为字典
相比较单星号转化为元组,双星号转化为字典就没有那么顺利,显然有很多的限制。
错误的使用方式
如果把上面例子中的单星号换成双星号,就得到了一个错误提示。
def test(a, b, **c):
print(c, type(c))
test("苏", "南", "大", "叔") # TypeError: test() takes 2 positional arguments but 4 were given
test("苏", "南", "叔") # TypeError: test() takes 2 positional arguments but 3 were given
如果改成就传两个参数的话,不报错,但是这个加双星号被强转字典的参数也没有啥用了。【看来**c就是var-keyword argument】
def test(a, b, **c, d): # SyntaxError: arguments cannot follow var-keyword argument
print(c, type(c))
正确的使用方式
def test(a, b, **c):
print(c, type(c))
test("苏", "南", c="大", d="叔") # {'c': '大', 'd': '叔'} <class 'dict'>
重点内容,python函数定义
从左到右推荐参数顺序为:位置参数、默认参数、单星号参数、关键字传参、双星号参数。
def test(a, b, c="默认值", *d, e, **f):
print(c, type(c))
print(d, type(d))
print(e, type(e))
print(f, type(f))
test("苏", "南", d="大", e="叔", f="博客")
这个输出为:
默认值 <class 'str'>
() <class 'tuple'>
叔 <class 'str'>
{'d': '大', 'f': '博客'} <class 'dict'>
相关文章
看来下面的这个文章需要更新了:
总结
结论是:实际效果上,单星号的位置变成了元组,双星号的位置变成了字典。
这个函数的参数问题,看起来比较简单好理解。但是实际上的运算过程中,还存在着很多不知道的坑。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。