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中使用异步Socket编程性能测试
Jun 25 Python
python获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
跟老齐学Python之模块的加载
Oct 24 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
python实现决策树分类(2)
Aug 30 Python
python实现简单加密解密机制
Mar 19 Python
python远程邮件控制电脑升级版
May 23 Python
python字典的遍历3种方法详解
Aug 10 Python
python画图常规设置方式
Mar 05 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
详解python的变量缓存机制
Jan 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字符串函数学习之substr()
2015/03/27 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
简单学习vue指令directive
2016/11/03 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
python文件操作整理汇总
2014/10/21 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
详解Python发送email的三种方式
2018/10/18 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
python如何提升爬虫效率
2020/09/27 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
乡镇三项教育实施方案
2014/03/30 职场文书
广播节目策划方案
2014/05/23 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
另类冲刺标语
2014/06/24 职场文书
会计学专业自荐信
2014/06/25 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
合同和协议有什么区别?
2014/10/08 职场文书
个人自荐书怎么写
2015/03/26 职场文书