python 中函数传递参数有四种形式
- fun1(a,b,c)
- fun2(a=1,b=2,c=3)
- fun3(*args)
- fun4(**kargs)
四种中最常见是前两种, 基本上一般点的教程都会涉及, 后两种一般很少单独出现, 常用在混合模式中
第一种 fun1(a,b,c) 是直接将实参赋予行参, 根据位置做匹配, 即严格要求实参的数量与行参的数量位置相等, 比较一般, 大多数语言常用这种方式.
第二种 fun2(a=1,b=2,c=3) 根据键值对的形式做实参与行参的匹配, 通过这种式就可以忽略了参数的位置关系, 直接根据关键字来进行赋值, 同时该种传参方式还有个好处就是可以在调用函数的时候作为个别选填项, 不要求数量上的相等, 即可以 fun5(3,4) 来调用 fun2 函数, 这里关键就是前面的 3,4 覆盖了原来 a,b 两个行参的值, 但 c 还是不变采用原来的默认值 3, 这种模式相较第一种更加灵活, 不仅可以通过 fun6(c=5,a=2,b=7) 来打乱行参的位置, 而且可以在但没有对应行参传递的时候常用定义函数时的默认值.
第三种 fun3(*args), 这传参方式是可以传入任意个参数, 这些若干参数都被放到了 tuple 元组中赋值给行参 args, 之后要在函数中使用这些行参, 直接操作 args 这个 tuple 元组就可以了, 这样的好处是在参数的数量上没有了限制, 但是因为是 tuple, 其本身还是有次序的, 这就仍然存在一定的束缚, 在对参数操作上也会有一些不便
第四种 fun4(**kargs) 最为灵活, 其是以键值对字典的形式向函数传参, 含有第二种位置的灵活的同时具有第三种方式的数量上的无限制. 此外第三四种函数声明的方式前的'*', 与 c 里面的指针声明一样, 这里仅做声明标识之用
最后要强调的是四种传递方式混合使用 (大多数情况是这种),fun7(a,b,*c,**d), 但四种方式混用时要遵守:
args = 须在 args 之后
*args 须在 args=value 之后
**kargs 须在 * args 之后
赋值过程为:
按顺序把传给 args 的实参赋值给对应的行参
args = value 形式的实参赋值给行参
将多余出的即键值对行后的零散实参打包组成一个 tuple 传递给 * args
将多余的 key=value 形式的实参打包正一个 dicrionary 传递给 **kargs
举例
定义
- def test(x,y=5,*,**b):
- >>>>print x,y,a,b
调用结果
- test(1) ===> 1 5 () {
- }
- test(1,2) ===> 1 2 () {
- }
- test(1,2,3) ===> 1 2 (3,) {
- }
- test(1,2,3,4) ===> 1 2 (3,4)
- test(x=1) ===> 1 5 () {
- }
- test(x=1,y=1) ===> 1 1 () {
- }
- test(x=1,y=1,a=1) ===> 1 1 () {
- 'a':1
- } test(x=1,y=1,a=1,b=1) ===> 1 1 () {
- 'a':1,'b':1
- }
- test(1,y=1) ===> 1 1 () {
- }
test(1,2,y=1) ===> 出错, 说 y 给赋了多个值
- test(1,2,3,4,a=1) ===> 1 2 (3,4) {
- 'a':1
- }
- test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4) {
- 'k':1,'t':2,'o':3
- }
来源: https://www.cnblogs.com/youzizz/p/9869583.html