Python笔记-函数参数

默认参数

定义默认参数,注意不要使用可变对象来定义,要使用不可变对象,比如str,None

Python在函数定义时,默认参数就会被计算出来,如果默认参数指向一个可变对象,比如[],每次使用默认参数调用函数时,都会使用默认参数指向的那个对象,则每一次调用,默认参数都会变化。

1
2
3
def add_end(L=[]):
L.append('END')
return L
1
2
3
4
5
6
>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

因此,最好不要使用可变对象来定义默认参数

可变参数

定义参数时,加一个*号,表示可以接收0个或任意个参数。任意个参数将会以tuple的形式传递。

1
2
3
4
5
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum

调用时,可以在listtuple前加上*号码,就可以直接传递。

1
2
3
>>> nums = [1, 2, 3]
>>> cals(*nums)
14

可变关键字参数

允许你传入0个或任意个含参数名的参数,传入时会自动在函数内部组装成一个dict

1
2
def person(name, age, **kw):
print('name', name, 'age', age, 'other', kw)
1
2
3
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

kw获得的是extra这个字典的一个拷贝,函数对kw做的操作不会影响函数外extra这个对象

命名关键字参数

限制关键字参数的名字,需要特殊分隔符*,定义命名关键字参数

1
2
3
4
5
6
# *号后的参数被视为吗命名关键字参数
def person(name, age, *, city, job):
print(name, age, city, job)
# 如果前面已经有了可变参数,则可以忽略分隔符
def person(name, age, *args, city, job):
print(name, age, args, city, job)

命名关键字参数调用时,必须传入参数名,否则会报错

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

参数组合

顺序必须是: 必选参数 –> 默认参数 –> 可变参数 –> 命名关键字参数 –> 可变关键字参数

1
2
3
4
def f1(a, b, c=0, *args, **kw):
print('a=', a, 'b=', b, 'c=', c, 'args=', args, 'kw=', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
1
2
3
4
5
6
7
8
9
10
11
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
# 可以直接通过tuple和dict调用
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

Python笔记-函数参数
http://example.com/2023/12/25/python-function/
作者
Peter Pan
发布于
2023年12月25日
许可协议