python 函数的调用的时候参数的传递_python定义函数时的参数&调用函数时的传参...

一、定义函数:

1、位置参数:直接定义参数

2、默认参数(或者关键字参数):参数名 = "默认值"

3、位置参数必须在默认参数之前

二、调用函数:

1、按位置传,直接写参数的值

2、按关键字传,关键字 = "值"

3、位置参数必须在关键字参数之前

4、关键字参数可在*args和**kwargs之前

注:调用时,无论定义的函数是使用位置参数还是默认值参数,调用函数时,都可以按位置传参或者按关键字进行传参,即调用时的传参形式和定义时的参数形式无关

def foo(a, b, c=3):print("a={},b={},c={}".format(a, b, c))

foo(1,2,3) #调用函数时按位置参数进行传参#输出 a=1,b=2,c=3

foo(a=1,b=2,c=3) #调用函数时按关键字参数传参

foo(c=3,a=1,b=2) #使用关键字传参时,与关键字的位置无关,即关键字参数之间不存在先后顺序#上面调用的结果是一样的

def foo(a, b, name=None,*args, **kwargs):print(name)print(args)print(kwargs)

A=(1, 2, 3)

B={"k1":"v1","k2":"v2"}

foo(1,2,C=6,*A,**B) #如果写成foo(1,2,C=6,1, 2, 3,**B)则会报错

1------->name

(2, 3)------->args

{'k2': 'v2', 'C': 6, 'k1': 'v1'}------->kwargs,C=6传入kwargs中

三、动态参数

定义函数时:

动态位置参数使用*args进行定义(参数前加一个*),将所有的值进行聚合成一个元组

动态关键字参数使用**kwargs进行定义(参数前加二个*),将所有的值进行聚合成一个字典

调用函数时:

1、使用位置参数和关键字参数进行传参

2、给一个序列加上*,就是将这个序列进行解包,然后按位置进行传参

3、给一个字段加上**,就是将这个字典进行解包,然后按关键字参数进行传参

def foo(*args):print(args)

foo(*[1,2,3])#输出 (1, 2, 3)

def foo(**kwargs):print(kwargs)

foo(**{"a":1,"b":2})#输出 {'a': 1, 'b': 2}

四、默认参数和可变参数混合使用

1、默认参数定义在可变参数之前

def foo(x,y = 1,*args):print(x)print(y)print(args)

foo(1,2,3,4,5,6,7,8,9) #调用函数,改变默认参数的值

1------->x=1

2-------->y=2(3, 4, 5, 6, 7, 8, 9)----->args的值变成元组

2、默认参数定义在可变参数之后

def foo(x,*args,y = 1000):print(x)print(y)print(args)

foo(1,2,3,4,5,6,7,8,9) #调用函数,使用默认值

1------->x=1

2-------->y=1000(2, 3, 4, 5, 6, 7, 8, 9)----->args的值变成元组

foo(1,2,3,4,5,6,7,8,y=2000) #调用函数,改变默认值

1------->x=1

2-------->y=2000(2, 3, 4, 5, 6, 7, 8)----->args的值变成元组

3、位置参数定义在可变位置参数之后

如果在一个星号参数后,或者在可变位置参数后出现普遍参数即位置参数,实际上已经不是普通参数了,而是keyworld-only参数(python3引入)

def foo(*args, x):print(args)print(x)

foo(1, 2, 3) #TypeError: foo() missing 1 required keyword-only argument: 'x'

foo(1,2,3,x=4)

args------>(1, 2, 3)

x------>4

1、args可以看做已经截获了所有的位置参数,x不使用关键字传参不可能拿到实参

2、使用foo(x=4,1,2,3)貌似可以,但是违反了关键字参数在位置参数之后的语法

五、复杂混合参数

#使用默认参数时,注意默认参数的位置要在args之后kwargs之前

def foo(x,*args,a=4,**kwargs):print(x)print(a)print(args)print(kwargs)

foo(1,5,6,7,8,y=2,z=3) #调用函数,不修改默认参数

1------->x=1

4------->a=4(5, 6, 7, 8)------->args

{'y': 2, 'z': 3}------->kwargs

#注意:当需要修改默认参数时,要调整默认参数的位置,要放在args之前即可,但不可放在开头

def foo(x,a=4,*args,**kwargs):print(x)print(a)print(args)print(kwargs)

foo(1,9,5,6,7,8,y=2,z=3) #调用函数,修改默认参数a为9

1------->x=1

9------->a=9(5, 6, 7, 8)------->args

{'y': 2, 'z': 3}------->kwargs

六、总结

定义函数时参数顺序:

1、位置参数--->默认参数--->可变位置参数--->可变关键字参数(调用时修改默认参数)

2、位置参数--->可变位置参数--->默认参数--->可变关键字参数((调用时可不修改默认参数)

调用函数顺序:

1、位置参数在关键参数之前,调用时的传参形式和定义时的参数形式无关

2、位置参数在最前,可变位置参数传参和关键字参数传参没有先后之分,可变关键字参数最后

def foo(a, b, *args, name=None,* *kwargs):print(name)print(args)print(kwargs)

A=(1, 2, 3)

B={"k1":"v1","k2":"v2"}

foo(1,2,C=6,*A,**B) #关键字在可变位置参数之前#None------->name#(2, 3)------->args#{'k2': 'v2', 'C': 6, 'k1': 'v1'}------->kwargs,C=6传入kwargs中

foo(1,2,*A,C=6,**B) #关键字在可变位置参数之后,输出结果和上面一致

foo(1,2,*A,**B,C=6) #SyntaxError: invalid syntax,语法错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值