第5.2节 Python的函数参数收集
函数的参数使用除了常规的位置参数和关键字参数外,还支持可变个数的函数参数,这种支持可变个数的参数方法称为参数收集,对应的参数称为收集参数。
一、参数收集的定义
Python的函数支持可变不定数量的参数模式,这种将不定数量实参在调用时传递给函数,函数将其识别并保存到指定形参的过程称为参数收集:
1、带一个星号的参数收集模式
这种模式是在函数定义时在某个形参前面加一个星号,调用时按位置匹配不带星号的形参和实参,多余的实参都将作为一个元组的元素保存到星号对应的形参中,该星号后的形参就称为收集参数。
这种模式的参数收集过程与前面介绍的序列解包类似,只是序列解包是将序列中多出的部分存放到星号后面的列表变量,而函数收集是将多出的参数存放到收集参数对应的元组变量。这种模式的参数收集与序列解包类似,收集参数最好是最后一个形参,但可以出现在函数参数的任何位置,只是此时该参数后面的参数在调用时必须用关键字参数模式传值,否则这些实参值都将作为收集参数的一部分。
举例:我们来实现一个计算函数,其终极目标是输入一串不限数量的数字,然后调用对应的运算符进行连续运算(如连加、连减、连乘等)。为了突出重点,我们在最初的例子只是定义这个函数并输出参数值,以来验证上面相关描述对于形参和实参的取值方法。后面章节再来完整实现该函数。
函数定义:
\>>> def cal(number1,number2=None,*numbers,calmethod='$'):
print('number1=',number1,',number2=',number2,',numbers=',numbers,', calmethod=',calmethod)
函数调用执行:
\>>> cal(1,'+')
number1= 1 ,number2= + ,numbers= () , calmethod= $
\>>> cal(1,2,'+')
number1= 1 ,number2= 2 ,numbers= ('+',) , calmethod= $
\>>> cal(1,2,3,'+')
number1= 1 ,number2= 2 ,numbers= (3, '+') , calmethod= $
\>>> cal(1,2,3,4,'+')
number1= 1 ,number2= 2 ,numbers= (3, 4, '+') , calmethod= $
\>>> cal(1,calmethod='+')
number1= 1 ,number2= None ,numbers= () , calmethod= +
\>>> cal(1,2,calmethod='+')
number1= 1 ,number2= 2 ,numbers= () , calmethod= +
\>>> cal(1,2,3,calmethod='+')
number1= 1 ,number2= 2 ,numbers= (3,) , calmethod= +
\>>> cal(1,2,3,4,calmethod='+')
number1= 1 ,number2= 2 ,numbers= (3, 4) , calmethod= +
\>>>
执行截图如下:

2、带两个星号的参数收集模式
第一种模式的收集参数不能收集关键字参数传递的实参,要收集关键字参数传递的实参,需要在收集参数前使用两个星号,此时收集参数对应的是一个字典而不是元组。
此种模式的收集参数必须放在函数的最后一个,这是因为关键字参数的函数参数之后不允许出现非关键字参数。此种情况的关键字参数的参数名,并不是上节内容介绍的函数定义中的关键字参数名,而是在实参调用时采用关键字参数形式传递的不定数量的参数。
两种模式的收集参数可以混用。
举例:
\>>> def cal(calmethod='+',*topnopers,**lastnopers):
print('运算符=',calmethod,',前几个运算参数为=',topnopers,',最后几个运算参数=',lastnopers)
\>>> cal('+',1,2,3,4,n5=5,n6=6,n7=7)
运算符= + ,前几个运算参数为= (1, 2, 3, 4) ,最后几个运算参数= {'n5': 5, 'n6': 6, 'n7': 7}
>>>

本节对Python函数的收集参数的内容结合例子进行了详细介绍,相关内容稍微有点复杂,希望老猿介绍的内容能有助于大家理解函数的收集参数使用方法,接下来还将继续介绍函数参数相关的其他内容。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第5.2节 Python的函数参数收集的更多相关文章
- (转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]): for i in range(x): ...
- python中函数参数的引用方式
值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...
- Python基础-函数参数
Python基础-函数参数 写在前面 如非特别说明,下文均基于Python3 摘要 本文详细介绍了函数的各种形参类型,包括位置参数,默认参数值,关键字参数,任意参数列表,强制关键字参数:也介绍了调用函 ...
- Python之函数&参数&参数解构
1.1函数定义 def 函数名(参数列表): 函数体(代码块) [return 返回值] p 函数名就是标识符,命名要求一样 语句块必须缩进,约定4个空格 Python的函数没有return语句,隐式 ...
- Python 中函数的 收集参数 机制
定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...
- Python 可变长度函数参数
func( *tuple_grp_nonkw_args, **dict_grp_kw_args ) 在编程的过程中,我们可能会遇到函数参数个数不固定的情况.这时就需要使用可变长度的函数参数来实现我们的 ...
- python中函数参数
默认参数注意点 优点:灵活,当没有指定与形参对应的实参时就会使用默认参数 缺陷: 例子: >>> def h(m, l=[]): #默认参数时列 ...
- 对Python中函数参数类型及排序问题,三个方面的总结
Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...
- python的函数参数传递方式
python的一切数据类型都是对象.但是python的对象分为不可变对象和可变对象.python的变量是引用,对python变量的赋值是引用去绑定该对象. 可变对象的数据发生改变,例如列表和字典,引用 ...
随机推荐
- 重温Java泛型,带你更深入地理解它,更好的使用它!
1. 引言 jdk5.0中引入了Java泛型,目的是减少错误,并在类型上添加额外的抽象层. 本文将简要介绍Java中的泛型.泛型背后的目标以及如何使用泛型来提高代码的质量. 2. 为什么要用泛型? 设 ...
- git引入_版本控制介绍
八个字形容git技术: 公司必备,一定要会 一.git概念: git是一个免费的,开源的分布式版本控制系统,可以快速高效的处理从小型到大型的项目 二.什么是版本控制: 版本控制是一种一个记录一个或若个 ...
- php执行exec、xsell_exec命令失败
在php.ini下进行更改 查找disable_function 去掉exec xsell_exec 重启php
- VBA_50段代码总结
'' 30个有用的VBA代码 '目录: '1--合理使用数组:'2--一次保存并关闭所 ...
- c++的基本点
C++的要点: 一个思想:抽象(和分类)的思想: 三个概念:类.对象.消息: 三个特征:封装.继承.多态: 一个观念:函数服务于数据. 程序 = 对象 + 消息 ...
- mysql之优化器、执行计划、简单优化
mysql之优化器.执行计划.简单优化 2018-12-12 15:11 烟雨楼人 阅读(794) 评论(0) 编辑 收藏 引用连接: https://blog.csdn.net/DrDanger/a ...
- 使用@Validated校验数据(除数据库做辅助)
一.controller层 /** * 使用@Validated来进行校验 * @author HuangJingNa * @date 2019年12月23日 下午6:02:20 * * @param ...
- rgw使用boto3生成可以访问的预签名url
前言 如果想访问一个ceph里面的s3地址,但是又不想直接提供secrect key的时候,可以通过预签名的方式生成url 生成方法 下载boto3 脚本如下 cat s3.py import bot ...
- Spring源码理论
Spring Bean的创建过程: Spring容器获取Bean和创建Bean都会调用getBean()方法. getBean()方法 1)getBean()方法内部最终调用doGetBean()方法 ...
- [原题复现][2020i春秋抗疫赛] WEB blanklist(SQL堆叠注入、handler绕过)
简介 今天参加i春秋新春抗疫赛 一道web没整出来 啊啊啊 好垃圾啊啊啊啊啊啊啊 晚上看群里赵师傅的buuoj平台太屌了分分钟上线 然后赵师傅还分享了思路用handler语句绕过select过滤.. ...