python学习手册笔记——18.参数
00.传递参数
a.参数的传递时通过自动将对象赋值给本地变量名来实现的。函数参数[调用者发送的共享对象引用值]再实际中只是Python赋值的另一个实例而已。因为引用是以指针的形式实现的,所有的参数实际上都是通过指针及逆行传递的。作为参数被传递的对象从来不自动拷贝
b.再函数内不得参数名得赋值不会影响调用者。
c.改变函数得可变对象参数得值也许会对调用者有影响。
d.不可变参数“通过值”进行传递。像证书和字符串这样得对象是通过对象引用而不是拷贝进行传递的,但是因为你无论怎样都不可能再原处改变不可变对象,实际的效果酒很想创建了一份拷贝。
e.可变对象是通过“指针”进行传递的。
01.
02.引用:参数。因为参数是通过赋值传递的,函数中的参数名可以在调用时通过变量实现共享都西昂。因此,函数中对可变对象参数在原处的修改能够影响调用者。
03.这样做仅仅时防止了这些改变会影响调用者。为了真正意义上防止这些改变,我们总是能够将可变对象转换为不可变对象来杜绝这种问题。
04.匹配语法
语法 位置 解释
func(value) 调用者 常规参数:通过位置进行匹配
func(name=value) 调用者 关键字参数:通过变量名匹配
func(*squence) 调用者 以name传递所有的对象,并作为独立的给予位置的参数
func(**dict) 调用者 以name成对的传递所有的关键字/值,并作为独立的关键字参数
def func(name) 函数 常规参数:通过位置或变量名进行匹配
def func(name=vlaue) 函数 默认参数值,如果没有再调用者宏传递的话
def func(*name) 函数 匹配并收集(在元组中)所有包含位置的参数
def func(**name) 函数 匹配并收集(在字典中)所有包含位置的参数
def func(*args, name) 函数 参数必须在调用中按照关键字传递
def func(*, name=value)
05.特定的参数匹配模式可以自由地确认又多少参数时必须传递给函数的。如果函数定于i了默认参数,如果你传递太少的参数他们就会被使用。如果一个函数使用*可变参数列表的形式,你能够传入任意多的参数;*变量名会将额外的参数收集到一个数据结构中去。
06.Python内部时使用以下的步骤来在赋值前进行参数匹配的:
a.通过位置分配非关键字参数
b.通过匹配变量名分配关键字参数
c.其他额外的非关键字参数分配到*name元组中
d.其他额外的关键字参数分配到**name字典中
e.用默认值分配给在头部为得到分配的参数。
07.通过变量名进行匹配的关键字,而在函数头部,它为一个可选的参数定义了默认值。无论是哪种情况,这都不是赋值语句。它是在这两种情况下的特定语法,改变了默认的参数匹配机制。
08.*和**,是让函数支持接受任意数目的参数的。他们都可以出现在函数定义或是函数调用钟,并且他们在两种场合下有着相关的目的。
09.解包参数:它域函数定义的意思相反。它会解包参数的集合,而不是创建参数的集合。
10.应用函数通用性
if <test>:
action,args = func1, (1,)
else:
action, args = func2, (1,2,3)
...
action(*args)
11.函数头部的排序规则通用化了,允许我们指定keyword-only参数——即必须只按照关键传递并且不会由一个位置参数来填充的参数。如果想要一个函数既处理任一多个参数,也接收可能的配置选项的话,这是很有用的。