python函数参数

函数的参数种类

位置参数(必选参数)、默认参数、可变参数、命名关键字参数、关键字参数

位置参数

def power(x):
    return x*x

默认参数
输入新的则按照新的记录,没有输入则按默认值记录

def power(x,n=2):
    if n>2:
        return x**n
    else:
        return x*x

print(power(3))
print(power(3,n=3))
#结果:
9
27

再比如:

def enroll(name, gender, age=6, city='Beijing'):
    print(name)
    print(gender)
    print(age)
    print(city)

enroll('Mike','F')
enroll('Jack','F',8,'Wuhan')
#结果:
Mike
F
6
Beijing

Jack
F
8
Wuhan

但是如果直接调用含有默认参数的函数的话,有的定义的函数对于默认参数就会赋予上一次的结果,默认参数会发生改变。

def add_end(L=[]):
    L.append('END')
    return L

print(add_end())
print(add_end())
print(add_end())
#结果:
['END']
['END', 'END']
['END', 'END', 'END']

可变参数
传入函数的参数个数是可变的,0个,1个或任意多个。由于参数个数不确定,我们想到可以把这些参数作为list或者tuple传进来。如:

def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

print(calc([1,2,3]))
#结果:
14

如果不想创建list或者tuple,直接输入参数的话,更改函数定义里的参数(加一个*):

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

如果已经有了一个list需要调用,则更改调用时的list(加一个*):

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

n = [1,2,3]
print(calc(*n))

这里将n和n互相的转化,有用且常见,可以理解为单个参数或者一个list或tuple直接的转化。*

关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数自动组装为dict。

def person(name, age, **kw):
    print(name,age,kw)

person('Michael', 30)
person('Bob', 35, city='Beijing')
#结果:
Michael 30 {}
Bob 35 {'city': 'Beijing'}

也可以先组装一个dict,然后把dict传进去:

extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)

Jack 24 {'city': 'Beijing', 'job': 'Engineer'}

命名关键字
限制关键字参数的名字,调用者仍可以传入不受限制的关键字参数,但只接收cityjob作为关键字参数。这时区分位置参数和关键字参数用一个*分隔符如:

def person(name, age, *, city, job):
    print(name, age, city, job)

person('Jack', 24, city='Beijing', job='Engineer')

如果函数定义中存在一个可变参数(随便加入的那种),就不需要分隔符了。如:

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

print(person('Jack', 24, 'Chaoyang',city='Beijing', job='Engineer'))
#结果:
Jack 24 ('Chaoyang',) Beijing Engineer

命名关键字也可以有缺省值(默认值)如:

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

综合来看一下
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

def f1(a, b, c=0, *args, **kw):  #这里有可变参数(可填可不填),关键字参数
    print(a,b,'c=',c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):  #这里有命名关键字参数,关键字参数
    print(a,b,'c=',c, 'd =', d, 'kw =', kw)

print(f1(1,2))
print(f1(1,2,3))
print(f1(1,2,3,'a','b'))
print(f1(1,2,3,'a','b',x=99))
print(f2(1,2,d=99,ext=None))
print(f2(1,2,'f=3',d=99,ext=None))

1 2 c= 0 args = () kw = {}
1 2 c= 3 args = () kw = {}
1 2 c= 3 args = ('a', 'b') kw = {}
1 2 c= 3 args = ('a', 'b') kw = {'x': 99}
1 2 c= 0 d = 99 kw = {'ext': None}
1 2 c= f=3 d = 99 kw = {'ext': None}

一样可以通过tuple或者dict传入。

>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
1 2 c= 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
1 2 c = 3 d = 88 kw = {'x': '#'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值