根据廖叔叔的python教程整理
函数参数
1. 位置参数
- 普通形式的参数,没有默认值
- 调用时可以按参数顺序传入对应参数,可以按关键字形式传入(x=123,按关键字传入可以不按顺序),所以位置参数也叫必选参数
- 位置参数必须在默认参数之前
def square(x):
return x * x
print(square(10))
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print(power(10, 2))
print(power(x=10, n=2))
print(power(10, n=2))
print(power(x=10, 2)) # SyntaxError: positional argument follows keyword argument
2. 默认参数
- 定义函数时带有默认值:参数=默认值。如果调用时没有值传递给默认参数,那么参数将取默认值
- 位置参数必须在默认参数之前
- 可以不按顺序提供默认参数。当不按顺序提供部分默认参数时,需要把参数名写上
- 使用默认参数有什么好处?最大的好处是能降低调用函数的难度
- 定义默认参数要牢记一点:默认参数必须指向不变对象,因为Python调用函数传递引用!
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print(power(5))
print(power(5, 2))
print(power(5, 3))
3. 可变参数
- 顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
- 由于函数调用提供了关键字以及非关键字两种参数类型,Python用两种方法来支持变长参数。一种是指定元组作为可变参数,另一种是指定字典作为关键字参数。
# 由于参数个数不确定,我们首先想到可以传入一个list或tuple
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
print(calc([1, 3, 5, 7, 9]))
print(calc((1, 3, 5, 7, 9)))
# 利用可变参数,稍微修改定义函数的方式,简化后续调用
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
print(calc(1, 3, 5, 7, 9)
nums = [1, 3, 5, 7, 9]
print(calc(*nums)) # *nums表示把nums这个list的所有元素作为可变参数传进去。
4. 关键字参数
如果有不定数目的或者额外集合的关键字,参数被放入一个字典中:键为参数名,值为相应的参数值。
def showInfo(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
showInfo('Bob', 35, city='Beijing')
showInfo('Adam', 45, gender='M', job='Engineer')
extra = {'city': 'Beijing', 'job': 'Engineer'}
showInfo('Jack', 24, **extra)
5. 命名关键字参数
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下
# 1.命名关键字参数需要一个特殊分隔符*
def showInfo(name, age, *, city, job):
print(name, age, city, job)
# 2.如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
def showInfo(name, age, *args, city, job):
print(name, age, args, city, job)
# 3.如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,命名关键字参数就变成位置参数了
def showInfo(name, age, city, job):
print(name, age, city, job)
6.参数组合
在Python中定义函数,可以用位置(必选)参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。