Python培训
400-996-5531
编写函数当然是为了调用它,正常情况下在调用函数的时候,都会传入参数。而传入参数的个数少则一两个,多则不限。
值传递与指针传递
在 Python 中,函数调用时有时候会改变调用参数的值,有时候并不会改变调用参数的值,其中的规律如下:
不可改变的参数通过“值传递”
例如:整数,字符串,元组等是通过值复制的形式传递到函数中。在函数内部对参数的改变不会影响外部的值。
通过“指针”传递
例如:列表,字典。其在函数内的改变会影响函数外的值。
如果想要传入的是列表参数,但是却不想在函数内的修改影响到函数外面的值,这种情况下可以创建以明确的拷贝参数:
参数匹配模式
经常能看到如下的函数定义:
第一次看到这种函数参数的定义我是懵逼的,心里在想,这是嘛啊? 怎么感觉像是 Java 呢?
以 * 为开始的函数参数,成为可变的参数,有封装和解包两种含义,分别对应函数的定义与调用两种情况。
首先说说函数定义的情况:
def func(name) 常规的参数,通过位置进行匹配
def func(name=value) 以变量名进行参数匹配的默认参数
def func(*name) 将额外不匹配的参数收集到元组中
def func(**name) 将额外不匹配的关键词参数收集到字典中
如果在函数定义的时候,使用了 *可变参数列表的形式,则在函数调用的时候,我可以传入任意多的参数,额外的参数将会被收集到一个特定的数据结构中。默认参数与关键字参数就不说了,主要说说任意参数的问题,即带有 * 的参数:
可以看出来, *args 参数会将函数调用时赋予的多余参数收集到一个元组中。并将这个元组命名为 args。 **kwargs 参数是将多余的参数收集到字典中,但它只对多余的关键字参数有效。
当函数定义的时候,可以出现多种参数形式的混合定义,例如:
其出现的顺序应该是: 常规参数(name),默认参数(name=value), *name 形式参数, **name 形式参数。
函数调用的情况:解包参数
在函数调用的时候使用 */** 语法用来对调用时的函数参数进行解包:
在函数调用时, *用来进行元组的解包,将元组的参数按顺序排列赋予函数参数。 ** 会以键值的形式解包字典,将得到的参数,按照键值赋予函数参数。
综上所述: 在函数定义的时候,使用 *、** 是为了收集参数。在函数调用的时候,使用 *、** 是为了解包参数。
Key-word Only 参数
注意: 此参数只在 3.0 以后的版本适用
Key-word Only 参数在函数定义参数列表中位于 *args之后,这些参数只接受关键字参数。
(下面给出的例子是在 Python 3.6 环境中运行。之前的例子是在 Python 2.7 运行)
也可以在函数列表中只使用 * 来标识这个函数不接受变长度的参数:
在这种情况下,这个函数只接受三个参数,a 是普通的参数, b,c 是关键字参数。
在函数定义时注意两点:
需要使用 **kwargs 时, 它必须出现在函数参数列表的最后。这样的话,定义时,函数参数列表的排序变为:常规参数(name),默认参数(name=value), *name 形式参数,Key-word Only 参数, **name 形式参数。
** 不能独自的出现在函数定义参数列表中。 * 可以独自出现。
对于包含 Key-word Only 参数 的函数调用问题:
当传递 Key-word Only 参数 的时候,其应该出现在 **kwargs 前,后者 Key-word Only 参数 可以由 **kwargs 解包出来。
Key-word Only 参数 可以出现在 *args 之前或者之后。
为什么要有 Key-word Only 参数? 只能说你在使用的过程中慢慢体会~
本文内容转载自网络,本着分享与传播的原则,版权归原作者所有,如有侵权请联系我们进行删除!
填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved