《Python学习手册 第五版》 -第18章 参数
在函数的定义和调用中,参数是使用最多喝最频繁的,本章内容就是围绕函数的参数进行讲解
本章重点内容如下:
1、参数的传递
1)不可变得参数传递
2)可变得参数传递
2、参数的匹配模式
1)位置次序:从左至右进行匹配
2)关键字参数:通过参数名进行匹配
3)默认值参数:为没有传入值得可选参数指定参数值
4)可变长参数收集:收集任意多的基于位置或关键字的参数
5)可变长参数解包:传入任意多的基于位置或关键字的参数
6)Keyword-only参数:必须按照名称传递的参数
其中第二部分是本章的重中之重,接下来进行详细讲解
1、参数的传递
1)不可变得参数传递
顾名思义,就是将一个参数传递给函数,不管函数如何操作,传递的参数是不会变的,及时函数内部有同样的变量名称,针对这一点,通过一下代码示例说明更容易理解:
以上代码很简单,首先是定义了一个简单的函数,就是把a赋值为99,然后创建一个变量a=100,将变量给到函数,然后重新再访问该变量,发现,变量a=100没有变化,这个地方其实也是会涉及到全局变量和局部变量的问题,可以参考上一个章节作用域的内容进行理解
2)可变参数传递
对比上面的理解,此处就比较容易理解,就是传递参数给函数,函数操作后,传递的参数有了变化,或者说参数是可变得,通过以下代码进行说明:
以上代码中,同时融入了不可变参数的传递(X=1),L是可变参数,通过函数change(),会发现,再调用L,L中的内容发生了变化
上面的两个示例可以看出,不可变和可变,其实是和传递参数自身以及函数的处理方式有关
2、参数的匹配模式
1)位置次序:从左至右进行匹配
这个比较容易理解,就是参数按照位置传递给函数对应的参数,具体代码示例如下:
以上是一个简单的例子,定义一个函数,然后打印a,b,c,在调用函数的时候,需要传递三个数据,因为函数有三个变量a,b,c,在传递数据的时候,如何知道,数据1要给到谁呢?数据2要给到谁呢?数据3要给到谁呢?系统采用位置的顺序,来依次赋值,第一个位置的数据赋值给a,第二个位置数据赋值给b,第三个位置数据赋值给c,所以最后打印的是1,2,3,为了进行对比说明,如果把1,2,3的位置换成2,1,3,则结果会是2,1,3,代码运行结果如下:
2)关键字参数:通过参数名进行匹配
就是通过参数的名称来匹配调用的内容,而不是位置,还是用上面的例子,如果改为关键字函数同样运行类似代码,结果会有所不同,具体代码示例如下:
因为在调用函数时,已经明确用参数的名称和对应的内容,所以通过关键字就能把内容赋值给参数变量,而不是按照位置
3)默认值参数:为没有传入值得可选参数指定参数值
默认值一般是在函数定义的时候就设定好的,就算你再调用函数时,不提供参数的值,函数依然会运行,为了说明有默认值和没有默认值的情况,还是沿用上面的代码,进行比对,具体代码示例如下:
以下是没有默认值参数的函数,在调用中,如果不传递三个参数的数据,函数就会报错
以下是有默认值参数的函数,在只有一个参数的数据情况下,依然是可以调用函数的
其实,默认值参数是对位置参数的一个补充和晚上,有默认值得参数,完全不影响位置参数的传递,以上面的默认值参数为例,如果你按照位置传递给参数数据,还是会执行位置次序的传递,具体代码示例如下:
4)可变长参数收集:收集任意多的基于位置或关键字的参数
有时候在调用函数,使用参数的时候,我们并不确认有多少参数,所以为了防止这种情况,使多个参数传递依然可以调用函数,就可以使用可变长参数收集,就是在按照位置对应给到相应参数后,把多余的数据,赋值给可变长参数,可变长参数有两种格式,一个是前面加【*】,一个是前面加【**】,具体代码示例说明:
由上面的代码可以看出,*d就是把其他位置的数据收集起来,作为一个元组一起操作,如果没有多余的数据,就打印空的元组
【*】是收集数据形成元组
【**】是收集数据形成字典,既然是字典肯定有key,所以需要用关键字的形式来调用函数,承接上面的函数,稍加修改,代码示例如下:
通过上面两个代码示例的对比可以发现,虽然都是要收集多余的数据成为一个参数变量,但是【*】与【**】的使用还是有很大差别的,【**】的使用,多出来的数据,必须是用关键字的形式,否则系统会报错
5)可变长参数解包:传入任意多的基于位置或关键字的参数
上面的例子说明的是将多余的数据收集到一个变量中,那反过来想,能否将一个数据,分给多个变量?可以的,此处使用【*】就是解包的作用,还是沿用上面的代码,具体示例如下:
首先是定义一个列表,里面有三个数据,然后整个列表直接传递给函数,也就是调用函数,通过【*】解包,依次赋值,会发现,和直接复制位置函数是一样的,但是从代码的格式看,更精简了
6)Keyword-only参数:必须按照名称传递的参数
前面提到的关键字参数,是可以和位置参数结合使用,甚至可以彼此替代,例如位置参数,可以通过关键字参数赋值调用函数
此处说的keyword-only参数与关键字参数有所区别和差异
keyword-only参数必须只按照关键字传入并且永远不会被基于位置参数来填充的参数;
位置:必须指定在一个单个星号后面,而不是两个星号
通过具体代码示例理解会更容易,代码示例如下:
如果位置不对,系统会提示错误,如下:
正确的位置如下:
然后通过调用该函数,会发现其中多个参数的对应关系
其中c=6,就是此处说的keyword-only参数,它是无法通过位置参数填充的
也就是说,如果你想改变c的参数,只能通过参数名来赋值,具体代码如下:
以上关于参数匹配的模式的运用,在实际的处理中会结合使用,使用会很灵活,所以不用拘泥于每一种形式,要根据具体问题来选择
好了,以上,就是本章的重点内容说明,下章再见!
《Python学习手册 第五版》 每章时间规划及完成进度:
2019.11.25-2019.12.01 第01章,已完成:《Python学习手册 第五版》 -第1章 问答环节
2019.12.02-2019.12.08 第02章,已完成:《Python学习手册 第五版》 -第2章 Python如何运行程序
2019.12.09-2019.12.15 第03章,已完成:《Python学习手册 第五版》 -第3章 你应如何运行Python程序
2019.12.16-2019.12.22 第04章,已完成:《Python学习手册 第五版》 -第4章 介绍Python对象类型
2019.12.23-2019.12.29 第05章,已完成:《Python学习手册 第五版》 -第5章 数值类型
2019.12.30-2020.01.05 第06章,已完成:《Python学习手册 第五版》 -第6章 动态类型
2020.01.06-2020.01.12 第07章,已完成:《Python学习手册 第五版》 -第7章 字符串基础
2020.01.12-2020.01.19 第08章,已完成:《Python学习手册 第五版》 -第8章 列表与字典
2020.01.20-2020.01.26 第09章,已完成:《Python学习手册 第五版》 -第9章 元组、文件与其他核心类型
2020.01.27-2020.02.02 第10章,已完成:《Python学习手册 第五版》 -第10章 Python语句简介
2020.02.03-2020.02.09 第11章,已完成:《Python学习手册 第五版》 -第11章 赋值、表达式和打印
2020.02.10-2020.02.16 第12章,已完成:《Python学习手册 第五版》 -第12章 if测试和语法规则
2020.02.17-2020.02.23 第13章,已完成:《Python学习手册 第五版》 -第13章 while循环和for循环
2020.02.24-2020.03.01 第14章,已完成:《Python学习手册 第五版》 -第14章 迭代和推导
2020.03.02-2020.03.08 第15章,已完成:《Python学习手册 第五版》 -第15章 文档
2020.03.09-2020.03.15 第16章,已完成:《Python学习手册 第五版》 -第16章 函数基础
2020.03.16-2020.03.22 第17章,已完成:《Python学习手册 第五版》 -第17章 作用域
2020.03.23-2020.03.29 第18章,已完成
2020.03.30-2020.04.05 第19章,未完成
以下链接,可以供你了解这个学习笔记的所有章节最新进度