我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在使用python的各种函数的时候,大家一定会发现,函数的参数传递有好多种方式。那么,为什么有这么多种参数传递的方式呢?这就要从python的函数定义中的参数定义来展开描述。

苏南大叔:python函数定义中形参特殊用法,形参前的星号是什么意思? - python星号用法
python函数定义中形参特殊用法,形参前的星号是什么意思?(图3-1)

大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔的代码编程经验所学所想。本文描述python中形参的几种用法,并且重点描述其中的形参前面使用了星号的用法,其中在形参前使用一个星号和使用两个星号有什么区别呢?本文测试环境:win10python@3.7.11

导读内容

本文涉及了元组tuple和字典dict的用法。参考文章:

这里就复习一下tupledict的定义方法:

_tuple = (1,)
_dict = {'name': '苏南大叔', 'age': 18}
print(_tuple,type(_tuple))
print(_dict,type(_dict))

输出内容:

(1,) <class 'tuple'>
{'name': '苏南大叔', 'age': 18} <class 'dict'>

还涉及了python的两个星号的用法,参考文章:

这里还复习一下argskwargs的用法:

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'

苏南大叔:python函数定义中形参特殊用法,形参前的星号是什么意思? - python星号类型
python函数定义中形参特殊用法,形参前的星号是什么意思?(图3-2)

形参前双星号,强转为字典

相比较单星号转化为元组,双星号转化为字典就没有那么顺利,显然有很多的限制。

错误的使用方式

如果把上面例子中的单星号换成双星号,就得到了一个错误提示。

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函数定义中形参特殊用法,形参前的星号是什么意思? - 正确打开方式
python函数定义中形参特殊用法,形参前的星号是什么意思?(图3-3)

重点内容,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'>

相关文章

看来下面的这个文章需要更新了:

总结

结论是:实际效果上,单星号的位置变成了元组,双星号的位置变成了字典。
这个函数的参数问题,看起来比较简单好理解。但是实际上的运算过程中,还存在着很多不知道的坑。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python