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的id()函数解密过程
Dec 25 Python
python实现进程间通信简单实例
Jul 23 Python
Python常用模块用法分析
Sep 08 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
Pytorch 实现权重初始化
Dec 31 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
增大python字体的方法步骤
Jul 05 Python
python中altair可视化库实例用法
Jan 26 Python
python实现简单反弹球游戏
Apr 12 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创建动态图像
2006/10/09 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
微信小程序手机号码验证功能的实例代码
2018/08/28 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python字符串的方法与操作大全
2018/01/30 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
Python 随机按键模拟2小时
2020/12/30 Python
python中PyQuery库用法分享
2021/01/15 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
酒吧总经理岗位职责
2013/12/10 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
保护野生动物倡议书
2014/05/16 职场文书
学校领导班子对照检查材料
2014/09/24 职场文书
中秋联欢会主持词
2015/07/04 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android