目录
简介
python 中函数有5种参数类型,位置参数,默认参数,可变参数,命名关键字参数和关键字参数,
在函数参数列表中,参数的优先顺序是
位置参数 >默认参数>可变蚕食>命名关键字参数>关键字参数
位置参数
- 给函数的位置参数传参时,参数位置与函数变量的位置一一对应。例如:
# 位置参数
def power(x,n):
sum = 1
while(n>0):
n=n-1
sum = sum * x
print( sum)
return sum
# 调用示例:
power(2,0)
给位置参数传参时,也可以通过列表或元组的方式进行
#传入的参数值是通过一个元组方式,如
tuple1 = (3,2)
power(*tuple1)
# 注 此时元组数据的个数必须与函数变量的个数一致
默认参数
我理解的是默认参数是位置参数的特殊类型,在定义函数的同时,给函数参数设置了默认值。
在调用函数时,默认参数可以被初始化,也可以不传入任何值
默认参数必须指向一个不可变对象。如果默认参数是一个可变参数时,当调用函数 默认参数被修改时,它的值就发生了变化。
示例:
# 默认参数
def add_end(L=None):
if L is None:
L = []
L.append("END!")
print(L)
return L
# 调用示例
add_end([1,2,3])
可变参数
定义可变参数时 在参数前面加一个*号, 表示该参数是可变参数了,
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
可以接受列表或元组类型的参数
可变参数函数应该如何调用
1 将参数值罗列在参数中
2. 当可变参数的值是列表或者是元组时,调用时,在变量前面添加 * 号
3. 可变参数在函数调用时自动组装为一个tuple
示例:
# 可变参数 可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
def caculate(*numbers):
sum = 0
for n in numbers:
sum = sum + n
print(sum)
return sum
# 调用示例
# 多个参数值依次传入
caculate(1,2,3,4,5)
caculate(1,2,3)
#
# 列表类型的可变参数
# para = [1,2,3,4,5]
# caculate(*para)
关键字参数
1. 定义关键字参数时,在参数前面添加两个星号 **
2. 允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
3. 关键字参数是,是函数调用数据的一个拷贝,函数内部修改关键字参数,不会影响传入的关键字参数的值 (即:传入的字典变量的值不会被更改)
示例:
# 关键字参数
def person(name,age,**kw):
print('name:', name, 'age:', age, 'other:', kw)
# 调用示例 1:
person("Jack", '13')
person("Jack",'13',city ='BeiJing',job='HeBei')
输出:
name: Jack age: 13 other: {}
name: Jack age: 13 other: {'city': 'BeiJing', 'job': 'HeBei'}
关键字参数也可以通过字典变量的方式调用,调用时在变量前面添加两个星号 **
示例:
# 通过字典变量给关键字参数传参
dicts = {'city':'BeiJing','job':'Engineer'}
person("Jack", '13',**dicts)
命名关键字参数
1. 限制关键字参数的名字(函数参数中将参数的关键字定义好)
2. 当函数参数中没有定义可变参数时,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
当函数参数列表中包含了可变参数,则不需要这个特殊的分割符号了。
示例:
# 函数定义中已没有一个可变参数,需要一个特殊的分割符号'*'
def person(name, age, *, city, job):
print(name, age, city, job)
# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
def person(name, age, *args, city, job):
print(name, age, args, city, job)
# 调用示例:
person("Jack",'13',city ='BeiJing',job='Engineer')
组合参数
Python函数中,可以用位置参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
但是,不要同时使用太多的组合,否则函数接口的可理解性很差
思考:
对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的。
参考资料:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888