Python 带星号(* 或 **)的函数参数详解


Posted in Python onFebruary 23, 2021

1. 带默认值的参数

在了解带星号(*)的参数之前,先看下带有默认值的参数,函数定义如下:

>> def defaultValueArgs(common, defaultStr = "default", defaultNum = 0):
    print("Common args", common)
    print("Default String", defaultStr)
    print("Default Number", defaultNum)

(1)带默认值的参数(defaultStr、defaultNum)不传参时的调用:

>> defaultValueArgs("Test")
 
Common args Test
Default String default
Default Number 0

(2)带默认值的参数(defaultStr、defaultNum),调用的时候可以直接传参(如下例中的defaultStr),也可以写成“argsName = value”的形式(如下例中的defaultNum):

>> defaultValueArgs("Test", "Str", defaultNum = 1)
 
Common args Test
Default String Str
Default Number 1
 
>> defaultValueArgs("Test", defaultNum = 1)
 
Common args Test
Default String default
Default Number 1

注意:在函数定义时,第一个带有默认值的参数之后的所有参数都必须有默认值,否则,运行时报错。

>> def defaultValueArgs(common, defaultStr = "default", defaultNum):
    print("Common args", common)
    print("Default String", defaultStr)
    print("Default Number", defaultNum)
    
SyntaxError: non-default argument follows default argument

2.带一个星号(*)的函数参数

带一个参数的函数定义如下:

>> def singalStar(common, *rest):
  print("Common args: ", common)
    print("Rest args: ", rest)

(1)带星号(*)的参数不传参:

>> singalStar("hello")
 
Common args: hello
Rest args: ()

带星号(*)的参数不传参时默认是一个空的元组。

(2)带星号(*)的参数传入多个值时(个数大于或等于函数定义时的参数个数):

>> singalStar("hello", "world", 000)
 
Common args: hello
Rest args: ('world', 0)

不难看出,第二种方式中,星号参数把接收的多个参数合并为一个元组。

(3)当我们直接传元组类型的值给星号参数时:

>> singalStar("hello", ("world", 000))
 
Common args: hello
Rest args: (('world', 0),)

此时,传递的元组值作为了星号参数的元组中的一个元素。

(4)如果我们想把元组作为星号参数的参数值,在元组值前加上" * " 即可。

>> singalStar("hello", *("world", 000))
Common args: hello
Rest args: ('world', 0)

>> singalStar("hello", *("world", 000), "123")
Common args: hello
Rest args: ('world', 0, '123')

3.带两个星号(**)的函数参数

带两个星号(**)的函数定义如下:

>> def doubleStar(common, **double):
    print("Common args: ", common)
    print("Double args: ", double)

(1)双星号(**)参数不传值:

>> doubleStar("hello")
 
Common args: hello
Double args: {}

带双星号(**)的参数不传值时默认是一个空的字典。

(2)双星号(**)参数传入多个参数时(个数大于或等于函数定义时的参数个数):

>> doubleStar("hello", "Test", 24)
TypeError: doubleStar() takes 1 positional argument but 3 were given

>> doubleStar("hello", x = "Test", y = 24)
Common args: hello
Double args: {'x': 'Test', 'y': 24}

可以看到,双星号参数把接收的多个参数合并为一个字典,但与单星号不同的是,此时必须采用默认值传参的 “ args = value ” 的方式,“ = ” 前的字段成了字典的键,“ = ” 后的字段成了字典的值。

(3)如果想把字典作为星号参数的参数值,那么该怎么办呢?与单星号参数类似,在字典值前加上 “ ** ”,同时其后不能添加任何值。

>> doubleStar("hello", {"name": "Test", "age": 24})
TypeError: doubleStar() takes 1 positional argument but 2 were given

>> doubleStar("hello", **{"name": "Test", "age": 24}, {"name": "Test2", "age": 24})
SyntaxError: positional argument follows keyword argument unpacking

>> doubleStar("hello", **{"name": "Test", "age": 24}, **{"name": "Test2", "age": 24})
TypeError: doubleStar() got multiple values for keyword argument 'name'

>> doubleStar("hello", **{"name": "Test", "age": 24})
Common args: hello
Double args: {'name': 'Test', 'age': 24}

4、在有些情况下,单星号函数参数和双星号函数参数是一起使用的:

def singalAndDoubleStar(common, *single, **double):
  print("Common args: ", common)
  print("Single args: ", single)
  print("Double args: ", double)

singalAndDoubleStar("hello")
# Common args: hello
# Single args: ()
# Double args: {}
singalAndDoubleStar("hello", "world", 000)
# Common args: hello
# Single args: ('world', 0)
# Double args: {}
singalAndDoubleStar("hello", "world", 000, {"name": "Test", "age": 24})
# Common args: hello
# Single args: ('world', 0, {'name': 'Test', 'age': 24})
# Double args: {}
singalAndDoubleStar("hello", "world", 000, **{"name": "Test", "age": 24})
# Common args: hello
# Single args: ('world', 0)
# Double args: {'name': 'Test', 'age': 24}
singalAndDoubleStar("hello", ("world", 000), {"name": "Test", "age": 24})
# Common args: hello
# Single args: (('world', 0), {'name': 'Test', 'age': 24})
# Double args: {}
singalAndDoubleStar("hello", *("world", 000), {"name": "Test", "age": 24}) 
# Common args: hello
# Single args: ('world', 0, {'name': 'Test', 'age': 24})
# Double args: {}
singalAndDoubleStar("hello", *("world", 000), **{"name": "Test", "age": 24})
# Common args: hello
# Single args: ('world', 0)
# Double args: {'name': 'Test', 'age': 24}

到此这篇关于Python 带星号(* 或 **)的函数参数详解的文章就介绍到这了,更多相关Python 带星号参数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
零基础写python爬虫之HTTP异常处理
Nov 05 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
python逆向入门教程
Jan 15 Python
深入了解Python iter() 方法的用法
Jul 11 Python
python 爬取学信网登录页面的例子
Aug 13 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
Mar 11 Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 Python
Python ellipsis 的用法详解
Nov 20 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
numpy数据类型dtype转换实现
Apr 24 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 #Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 #Python
python链表类中获取元素实例方法
Feb 23 #Python
Python之多进程与多线程的使用
Feb 23 #Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 #Python
matplotlib grid()设置网格线外观的实现
Feb 22 #Python
浅析python连接数据库的重要事项
Feb 22 #Python
You might like
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
php+mysql数据库查询实例
2015/01/21 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
js实现简单页面全屏
2019/09/17 Javascript
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python字符串详细介绍
2015/05/09 Python
编写Python CGI脚本的教程
2015/06/29 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
python opencv之SURF算法示例
2018/02/24 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
PyCharm代码格式调整方法
2018/05/23 Python
python 字段拆分详解
2019/12/17 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
贸易跟单员英文求职信
2014/04/19 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
初中同学会致辞
2015/08/01 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python
python3实现常见的排序算法(示例代码)
2021/07/04 Python