转载自函数的参数_廖雪峰
函数参数
- 位置参数
- 默认参数
默认参数降低了函数调用的难度
调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数时,需要把参数名写上
必选参数在前,默认参数在后
定义默认参数要牢记一点:默认参数必须指向不变对象!
- 可变参数
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个号
在list或tuple前面加一个号,把list或tuple的元素变成可变参数传进去
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
- 关键字参数
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra
- 命名关键字参数
要限制关键字参数的名字,就可以用命名关键字参数
# 命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
def person(name, age, *, city, job):
print(name, age, city, job)
# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
def person(name, age, *args, city, job):
print(name, age, args, city, job)
使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个作为特殊分隔符。如果缺少,Python解释器将无法识别位置参数和命名关键字参数
- 参数组合
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
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)
# 通过一个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': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。
参考:
函数的参数_廖雪峰