详解Python中函数参数

1.位置参数 positional

def fun(a, b, c):
    print('a=%d, b=%d, c=%d'%(a,b,c))
fun(1,2,3)

a=1, b=2, c=3

2.关键字参数 keyword

def fun(a, b, c=4):
    print('a=%d, b=%d, c=%d'%(a,b,c))
fun(1,c=2,b=3)
fun(1,b=3)

a=1, b=3, c=2
a=1, b=3, c=4

函数调用时,non-keyword参数必须在keyword参数之前。
3.包裹位置传递
以*起始的参数会接收所有其他参数

def fun(a, *b):
    print('a=%d'%a)
    # b是一个元组
    for i in b:
        print(i)
fun(1,2,3)

a=1
2
3

b也可以接受元组作为参数,只需要在参数前面加上*:

par = (2,3,4)
fun(1,*par)

4.包裹关键字传递

def fun(a, **b):
    print('a=%d'%a)
    print(b)
fun(2,key=89)

a=2
{'key': 89}

b会接收最后的命名参数,b也可以接受字典作为参数,只需要在参数前面加上**:

def fun(a, m=9, *b, **c):
    print('a=%d'%a)
    print(b)
    print(c)
par = {'d':'val0','e':99}
fun(2,5,6,**par)

a=2
(6,)
{'e': 'val', 'd': 99}

不过因为par的keys是作为关键字参数的,所以必须是str类型。


函数最多有一个包裹位置参数,最多有一个包裹关键字参数。

*arg,**kw这两个参数就可以接收所有的参数:

def fun2(*arg, **kw):
    print(arg, kw)
fun2(2,5,6,key=90)

(2, 5, 6) {'key': 90}

位置参数如果有默认参数,带默认参数的位置参数必须要在不带默认参数的位置参数之后。下面的函数就是错的:

# 错误!
def person(name, age, city='Beijing', job):
    print(name, age, city, job)
person('li', 25, job='Engineer')

不过可以添加一个空的包裹位置参数:

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
person('li', 25, job='Engineer')

*是空的,所以它不接受任何参数,但*之后的参数都被视为关键字参数,所以此时需要显示指定job='Engineer'


Python里的参数传递都是引用传递,唯一的例外是,将一个字典作为包裹关键字参数传递时,传递的是字典的副本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值