第5.3节 详说Python风格的函数分配参数
一、 分配参数的定义
参数收集就是在定义函数时不能确认参数个数,用收集参数将调用时不确定数量的实参存放到收集参数的元组中。分配参数与此过程相反,它不是在定义函数形参时使用星号(1个或2个),而是在调用函数传递实参时使用星号(1个或2个)来传递多个参数。
二、 分配参数的使用
1. 使用1个星号的分配参数
使用1个星号的实参时,实参为一个元组、列表、字典或集合,该实参内的元素将按参数顺序传递给函数,但由于字典实际传值取的是键,集合的元素没有顺序,因此不建议使用字典和集合传值。
举例:
>>> def cal(calmethod,number1,number2,*numbers):
print('number1=',number1,',number2=',number2,',numbers=',numbers,', calmethod=',calmethod)
>>> paras=('+',1,2,3,4) #元组分配参数传值
>>> cal(*pars)
number1= 1 ,number2= 2 ,numbers= (3, 4) , calmethod= +
>>> paras=['+',1,2,3,4]
>>> cal(*paras) #列表分配参数传值
number1= 1 ,number2= 2 ,numbers= (3, 4) , calmethod= +
>>> paras={'+',1,2,3,4}
>>> cal(*paras) #集合分配参数传值,顺序变化了
number1= 2 ,number2= 3 ,numbers= (4, '+') , calmethod= 1
>>> paras={'+':10,1:20,2:30,3:40,4:50}
>>> cal(*paras) #字典分配参数传值,取的是键作为参数
number1= 1 ,number2= 2 ,numbers= (3, 4) , calmethod= +


从上面的例子可以看出,一个星号的收集参数可以通过1个星号的分配参数方式传值。
老猿认为,分配参数实际上就是将实参传递的序列数据解包给对应形参的过程。
2. 使用2个星号的分配参数
使用2个星号的实参时,实参为一个字典,该字典内的元素将按关键字参数模式传递给函数,其中的键为关键字参数,值为关键字参数对应的实参值。使用这种模式要求该实参位于参数列表末尾。还是以上面函数为例:
\>>> paras={'calmethod':'+','number1':1,'number2':2,'numbers':[3,4,5]}
\>>> cal(**paras) #报错遇到没有预期的关键字参数'numbers'
\>>> paras={'calmethod':'+','number1':1,'number2':2,'numbers':(3,4,5)}
\>>> cal(**paras) #报错遇到没有预期的关键字参数'numbers'
\>>> paras={'calmethod':'+','number1':1,'number2':2,'*numbers':(3,4,5)}
\>>> cal(**paras) #报错遇到没有预期的关键字参数'*numbers'
\>>> paras={'calmethod':'+','number1':1,'number2':2}
\>>> cal(**paras)
number1= 1 ,number2= 2 ,numbers= () , calmethod= +

从上面的案例可以看出来:
1) 两个星号的参数分配不能给两个星号的收集参数传值,因为这没有意义,还不如直接使用形参为字典类型实参是字典数据进行操作。
2) 分配参数模式和收集参数模式可以并存,如上面的例子,但这种使用方式意义不大,一般不建议使用。
本节对Python函数的分配参数的内容结合例子进行了详细介绍,相关内容稍微有点复杂,希望老猿介绍的内容能有助于大家理解函数的分配参数使用方法。截止本节为止,函数的参数使用方法基本介绍完了,大家好好理解掌握一下。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
第5.3节 详说Python风格的函数分配参数的更多相关文章
- Python入门篇-函数、参数及参数解构
Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...
- python中的函数的参数和可变参数
最近在搞python的过程中需要用到给函数传可变参数..所以去网上找前人的帖子学习了一下 为了尊重原作者,这里附上链接:http://www.cnblogs.com/tqsummer/archive/ ...
- python 复习 4-1 函数、参数、返回值、递归
函数 完成特定功能的一个语句组,这个语句组可以作为一个单位使用,并且给它组语句取一个名子,即函数名 可以通过函数名在程序不同地方多次执行,即函数调用 预定义函数(可以直接使用) 自定义函数(自编写的) ...
- python 中_init_函数以及参数self
1)class类包含: 类的属性:类中所涉及的变量 类的方法:类中函数 2)_init_函数(方法) 1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问. 2. ...
- python中定义函数和参数的传递问题
作者:達聞西链接:https://zhuanlan.zhihu.com/p/24162430来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 5.2.4 函数.生成器和类 ...
- Python进阶04 函数的参数对应
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经接触过函数(function)的参数(arguments)传递.当时我们根 ...
- python学习:函数传参数
#!/usr/bin/python import sys def isNum(s): for i in s: if i in '0123456789': ...
- python报错函数传参数传多了
写python的时候报错: Exception : Traceback (most recent call last): File , in __bootstrap_inner self.run() ...
- 【学习笔记】--- 老男孩学Python,day10, 函数, 动态参数 命名空间\作用域 global nonlocal
1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序:位置---*args---默认值---**kwargs 在形参上*聚合, **聚合 在实参上*打散, ...
随机推荐
- 全排列算法--递归实现(Java)
求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现. 首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件.以[1, 2]为例 首先展示一下主要 ...
- vue踩坑
1. 双向绑定的对象 改变或新增其属性 DOM不刷新问题 var obj = { "attr1": "1", "attr2": [2] }; ...
- leetcode115:search -insert-position
题目描述 给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标.如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标 假设数组中没有重复项. 下面给出 ...
- python_socket_tcp_文件传输
server.py import json import struct import socket # 接收 sk = socket.socket() # sk.bind(('127.0.0.1',9 ...
- 经典分治问题,平面N个点求最近点对
大家好,我们今天来看一道非常非常经典的算法题--最近点对问题. 这个问题经常在各种面试当中出现,难度不低,很少有人能答上来.说实话,我也被问过,因为毫无准备,所以也没有答上来.是的,这道题有点神奇,没 ...
- 【应用服务 App Service】App Service 新手资料包
问题描述 云计算的趋势已成定局,作为一个开发者,如果想对PaaS服务中的应用服务有一个初步的了解,从那些资料入手呢? 以Azure的官方文档作为基础库,从中选择出部分内容,分为:本地开发工具,App ...
- epoll内核源码详解(转 作者:赛罗·奥特曼 来源:牛客网)
发现自己发的一篇面经后,很多小伙伴向我索要epoll的内核源码实现,那我就在牛客网发下这源码还有自己总结的流程. 另外 网上很多博客说epoll使用了共享内存,这个是完全错误的 ,可以阅读源码,会发现 ...
- TCP回射客户服务器模型(02 设置套接字选项、处理多并发)
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); //设置套接字选项 ...
- 《.NET 5.0 背锅案》第6集-案发现场回顾:故障情况下 Kubernetes 的部署表现
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- 丢了ceph.mon.keying解决办法
在linux操作系统下,可能因为一些很小的误操作,都会造成非常重要的文件的丢失,而文件的备份并不是每时每刻都会注意到,一般是等到文件丢失了才会去想办法,这里讲下ceph.mon.keyring丢失的解 ...