第十八章、参数
传递参数
①、参数的传递是通过自动将对象赋值给本地变量名来实现的。
②、在函数内部的参数名的赋值不会影响调用者。
③、改变函数的可变对象参数的值也许会对调用者有影响。
④、不可变参数“通过值”进行传递。
⑤、可变对象是通过“指针”进行传递的。
1、参数和共享引用:
对可变对象的在原处的修改会影响其他引用了该对象的变量。
2、避免可变参数的修改:
3、对参数输出进行模拟:
特定的参数匹配模式
1、基础知识:
①、位置:从左至右进行匹配。
②、关键字参数:通过参数名进行匹配。
③、默认参数:为没有传入值的参数定义参数值。
④、可变参数:收集任意多基于位置或关键字的参数。
⑤、可变参数解包:传递任意多的基于位置或关键字的参数。
⑥、Keyword-only参数:参数必须按照名称传递。
2、匹配语法:
3、细节:
如果决定适应并混合特定的参数匹配模式,Python将会遵循下面有关顺序的法则:
①、在函数调用中,参数必须以此顺序出现:任何位置参数(value),后面跟着任何关键字参数(name=value)和*sequence形式的组合,后面跟着**dict形式。
②、在函数头部,参数必须以此顺序出现:任何一般参数(name),紧跟着任何默认参数(name=value),如果有的话,后面是*name(或者在Python3.0中是*)的形式,后面跟着任何name或name=value keyword-only参数(在Python3.0中),后面跟着**name形式。
Python内部是使用以下的步骤来在赋值前进行参数匹配的:
①、通过位置分配非关键字参数。
②、通过匹配变量名分片关键字参数。
③、其他额外的非关键字参数分配到*name元组中。
④、其他额外的关键字参数分配到**name字典中。
⑤、用默认值分配在头部未得到分配的参数。
4、关键字参数和默认参数实例:
①、关键字参数:
在Python中,调用函数的时候,能够更详尽的定义内容传递的位置。关键字参数允许通过变量名进行匹配,而不是通过位置。
②、默认参数:
简而言之,默认参数允许创建函数可选的参数。如果没有传入值的话,在函数运行前,参数就被赋了默认值。
③、关键字参数和默认参数的混合:
5、任意参数的实例:
①、收集参数:*/**在头部,他意味着收集任意数量的参数。
②、解包参数:*/**在调用时,它解包任意数量的参数。
③、应用函数通用性:
④、废弃的apply内置函数(Python2.6):
6、Python3.0 Keyword-Only参数:
Python3.0把函数头部的排序规则通用化了,运行我们指定keyword-only参数——即必须只按照关键字传递并且不会由一个位置参数来填充的参数。
①、排序规则:
注意keyword-only参数必须在一个单个星号后面指定,而不是两个星号——命名的参数不能出现在**args任意关键字形式的后面,并且一个**不能独自出现在参数列表中。
在一个函数头部,keyword-only参数必须编写在**args任意关键字形式之前,且在*args任意位置形式之后,当二者都有的时候。无论何时,一个参数名称出现在*args之前,它可能是默认位置参数,而不是keyword-only参数。
keyword-only参数可以编写在*args之前或者之后,并且可能包含在**args中。
②、为何使用keyword-only参数:
简而言之,它们使得很容易允许一个函数既接受任意多个要处理的位置参数,也接受作为关键字传递的配置选项。
7、min调用:
8、满分:
9、加分点:
10、结论:
一个更有用的例子:通用set函数
模拟Python3.0 print函数
1、使用Keyword-Only参数:
本章小结
在本章中,我们学习了与函数相关的两个关键概念中的第二个:参数(对象如何传递给函数)。正如我们所学到的,参数通过赋值传递到函数中,赋值方式是通过对象引用,实际上是通过指针传递到函数中。我们还学习了一些更高级的扩展,包括默认参数和关键字参数、使用任意的多个参数的工具,以及Python3.0中的关键字参数。最后,我们还学习了可变参数如何表现出与其他的对象共享引用一样的行为——除非对象在发送进来的时候显式地复制,在一个函数中修改一个传入的可变对象可能会影响调用者。