python可变参数_Python 的四种共享传参详解
点击上方“Python数据之道”,选择“星标公众号”
精品文章,第一时间送达
作者 | 杨仁聪
编辑 | Lemon
出品 | Python数据之道
本文来自公众号读者投稿,欢迎各位童鞋向公号投稿,点击下面图片了解详情!
Python 的四种共享传参详解
Python 唯一支持的参数传递方式为共享传参(call by sharing),传递参数一共有四种传递方式,分别为:位置参数,默关键字参数和可变参数,其中可变参数分为两种(*args 和 **kargs)。
一、位置参数
函数调用时,参数会根据函数定义的参数位置而自动传递。
def func(a, b):
print(a)
print(b)
return a+b
>>func("A", "B")
A
B
'AB'
>>func("B", "A")
B
A
'BA'
在上述实例中,我们发现参数的传递必须严格按照参数的定义位置进行传递的,而且函数的参数与调用函数所传递的参数数量不一致时,就会引发TypeError。
二、默认参数
函数调用时,为函数的某个参数提供默认值,调用函数时可选择不传入改参数的值。
def func(a="B", b):
print(a)
print(b)
return a+b
SyntaxError: non-default argument follows default argument
def func(a, b="A"):
print(a)
print(b)
return a+b
>>func("A")
A
A
'AA'
>>func("A", "B"):
A
B
"AB"
从上述实例中,我们发现默认参数必须在位置参数的后面。个人认为默认参数是位置参数的一种缺省形式。这也可以解释为何默认参数必须在位置参数的后面。
三、关键字参数
在进行函数调用时,使用 "参数名"="值" 的形式进行参数指定。清除位置参数在调用时的顺序要求。
def func(a, b):
print(a)
print(b)
return a+b
>>func(b="B", a="A")
A
B
"AB"
def func(a, b="B"):
print(a)
print(b)
return a+b
>>func(a="A")
A
B
'AB'
>>func(a="A", b="C"):
A
B
'AC'
从上述实例可以看出,虽然函数定义时按照位置参的形式定义的,但是依然可以在调用的时候可以使用关键字参数来进行指定,如果函数定义时有默认参数,则依然可以选择缺省或者传入。
四、可变参数
可变参数是指在函数定义时使用 *args (*加参数名)和 **kargs (**加参数名)的形式作为参数,在函数调用时就可以传入多个参数,会在实际工程中更加灵活,其中 *args 对应着传入多个位置参数,**kargs 对应传入多个关键字参数。
def func(*args):
print(type(args))
print(args)
for i in args:
print(i)
>>func("A", "B")
<class 'tuple'>
('A', 'B')
A
B
>>> func()
<class 'tuple'>
()
从上述实例中可以看出,可变参数 *args 在使用时可以自由选择位置参数个数,在函数使用时,函数会自动生成一个元组 (tuple) 来放置位置参数,我们在定义函数的时候只需要操作对应的元组即可,注意一个小细节,为何要使用元组?这实际上也对应了位置参数的位置不可变性。
def func(**kargs):
print(type(kargs))
print(args)
for key, value in kargs.items():
print("%s : %s" % (key,value) )
>>> func(a="A", b="B")
<class 'dict'>
{'a': 'A', 'b': 'B'}
a : A
b : B
>>> func(b="B", a="A")
<class 'dict'>
{'b': 'B', 'a': 'A'}
b : B
a : A
>>> func()
<class 'dict'>
{}
从上述实例可以看出,可变参数 **kargs 使用时也可以自由选择关键字参数的个数,在函数使用时,函数会生成一个字典(dict)来放置关键字参数,我们在定义函数时只需要操作对应的字典字典即可,同样注意一个小细节,为何是使用字典?这同样也对应了关键字参数的位置可变性。
五、四种参数的混用
我们在实际应用中,经常会用到这几种参数的搭配使用,下面通过一个例子来解释这四种参数的混用情况。
def func(a, b="B", *args, c,**kargs):
print(a)
print(b)
print(*args)
print(c)
print(kargs)
>>> func("A", "X", "Z", c="CC", d="DD", f="FF")
A
X
Z
CC
{'d': 'DD', 'f': 'FF'}
>>> func("A",c="CC")
A
B
CC
{}
从上述实例中可以看出,我们在混用时主要遵循两个原则
1.在函数定义时,顺序为(位置参数,默认参数,*args 可变参数,关键字参数, **kargs 可变参数)。
2.在调用时,位置参数和关键参数一定要有,不可缺省,可变参数可以缺省。特别注意,如果定义了默认参数,又定义了 *args 可变参数,需注意位置参数的个数,因为函数调用默认会先识别默认参数。上述实例中就有这种情况。
因作者个人水平有限,如果文章中有问题或者错误,请大家多多指正,谢谢。
作者简介
杨仁聪,长安大学信息工程学院研究生一年级,交通运输工程专业,从 python 学习开始,梦想能够加入一个世界500强企业,成为一位优秀的 python 工程师。
留言打卡DAY xx
今日主题:聊聊你对 Python 函数中参数的理解~
『留言打卡活动』
公号后台回复 “留言打卡”,了解活动详情。
-------------------End-------------------
python可变参数_Python 的四种共享传参详解相关推荐
- python中怎么计数_浅谈python中统计计数的几种方法和Counter详解
1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...
- java中的json_JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- 计算机曝光模式有哪些,摄影:单反相机中P、A、S、M四种曝光模式的用法详解 -电脑资料...
这篇教程是向脚本之家的朋友介绍单反相机中P.A.S.M四种曝光模式的用法,对于摄影爱好者非常值得学习,推荐到脚本之家,喜欢的朋友一起来看看吧 很多朋友在初接触单反相机时对相机的P.A.S.M四种曝光模 ...
- C#进阶系列——WebApi 接口参数不再困惑:传参详解
看这边文章时的疑惑是:WebApi中的参数加了[FromBody],不知所以然,就百度了下,看到了以下文章,和大家分享下: 原文链接:http://www.cnblogs.com/landeanfen ...
- WebApi 接口参数不再困惑:传参详解
阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4."怪异"的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4 ...
- 【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解
阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4."怪异"的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4 ...
- Python 函数传参详解
Python位置传参 位置传参也称为必备参数,必须按照正确的顺序将参数传递到函数中,定义函数时的参数与实际传入的参数数量必须保持一致 正常如下: def par(A,B):return A+B pri ...
- Python 读取文件四种姿势:实例详解,从此读取文件更得心应手
Python文件读取的四种方式如下: 1. 逐行读取文件内容 逐行读取文件内容可以使用 for 循环和文件句柄对象,如下所示: with open('file.txt', 'r') as f:for ...
- python中参数前面加星号是什么意思_详解Python函数中参数带星号是什么意思
函数的参数使用除了常规的位置参数和关键字参数外,还支持可变个数的函数参数,这种支持可变个数的参数方法称为参数收集,对应的参数称为收集参数. 一.参数收集的定义 Python的函数支持可变不定数量的参数 ...
最新文章
- Cisco IOS的故障恢复方法
- 测试Robotium
- 【iOS报错】“The operation couldn’t be completed (LaunchServicesError erro
- 客户端升级为select模型
- 测试你的开源 IQ 答案
- 2018-2019-2 网络对抗技术 20165303 Exp4 恶意代码分析
- 如何锻炼膝盖和膝盖周围肌肉_我的分享膝盖照片的社交网络将如何拯救世界
- jdk的ServiceLoader
- JavaWeb之Cookie
- C#中,两个事件的叠加,结果会如何?
- 实验二 20145237 20155226 2015234 实验报告 固件程序设计
- java. 饼图的下面标签显示_饼图的数据标签太乱怎么办?
- 怎么回滚版本_Win 10 暂停更新及回滚方法
- 【数学题】Multicolored Markers【codeforces-Round #506-div3-F】
- 京东商城涉足电子书的醉翁之意
- Required request body is missing 问题解决
- bak 安全牛 kali link
- 【前端学习笔记—canvas标签和使用canvas画哆啦A梦案例】
- Perl之单行命令特技
- SQL Server添加MDW性能监控报表(转载)
热门文章
- python培训班时间 费用-python培训班费用在多少?
- python培训班哪些比较好-python培训机构哪家比较好?
- python菜鸟教程字典-python教程菜鸟教程学习路线
- python面试-10个Python面试常问的问题(小结)
- python怎么变白-python – 在热图中使反向对角线变白
- python中requests库的用途-python中requests库的post请求
- python适合做后端开发吗-想从事Python 后端开发?
- Python的try... excep异常捕捉机制
- python 正则表达式re 模块的使用
- mysql读写分离和组复制_数据库主从复制,读写分离,负载均衡,分库分表分别表达的什么概念?...