1,关键字参数
如果参数过多,不确定参数的顺序,可以使用关键字参数传递数据,避免误传数据。
代码示例:
def persion(name, age):
print(name)
print(age)
# 位置参数,最常见的参数传递形式
persion("张三", 34)
# 关键字参数,将数据传给指定的参数,避免数据误传
persion(name="张三", age="34")
# 第一个不指定,第二个指定,这样的形式是可以的
persion("张三", age="34")
# 这种形式报错
# persion(name="张三", 34)
console:
张三
34
张三
34
张三
34
注:
函数的第一个参数不指定关键字,后面的参数依然可以使用关键字参数,但当函数的第一个参数使用了关键字参数时,后面的其他参数就必须要使用关键字参数来传递数据。
2,命名关键字参数
强制控制明明关键字的个数(python3新增的)
代码示例:
# 星号表示后面的参数都必须使用命名关键字参数来传值
def func(name, age, *, weight, position):
print(name)
print(age)
print(weight)
print(position)
# 这样传值会出错
#func("李四", 45, 69, "china")
# 正确的传值方法,即使顺序颠倒也不会出错
func("李四", 45, position="china", weight=69)
console:
李四
45
69
china
注:
使用命名关键字会使代码的可读性好,简洁明了,不会出错。
3,缺省参数
在形参中默认有值的参数,称之为缺省参数(默认参数)
调用函数时,缺省参数的值如果没有传入,则取默认值。
代码示例:
# 创建函数时,默认参数写在位置参数后面
def infor(name="abc", age=45):
print(name)
print(age)
# 这里不设置任何参数
infor()
print("= "*10)
# 这里的实际参数替换了默认参数
infor("张三",)
print("= "*10)
# 这里把34传给了默认参数
infor(34)
# 这里将两个默认参数都替换掉
print("= "*10)
infor("王五", 78)
注意:
带有默认值的参数一定要位于参数列表的最后面。
3,1 缺省参数的坑
默认参数在定义时,一定要指向不可变数据类型。
示例:
# 这里声明了一个函数的缺省参数
def add(list=[]):
list.append(100)
print(list)
# 三次调用
add()
add()
add()
console:
[100]
[100, 100]
[100, 100, 100]
注:
原因在于我们在设置缺省参数时,将其设置为可变数据类型,调用时,得到的不是我们想要的原生的空列表,而是在上一次的操作后得到的值,
调整一下:
# 这里依然设置了一个函数的缺省值
def adda(list=None):
# 这里是一个初始化的操作
if list == None:
list = []
list.append(100)
print(list)
adda()
adda()
adda()
console:
[100]
[100]
[100]
注:
在这个函数中,每一次的调用都会判断,然后将函数的缺省值初始化,保证与之前的调用无关联。
3,不定长参数
有时可能需要一个函数能处理比当初声明时更多的参数, 这些参数叫做不定长参数(即:可变参数),声明时不会命名。
3,1 *age
可变参数的第一种形式
加了星号(*)的变量args会存放所有未命名的变量参数,args为元组
代码示例:
# *age会把传进来的多个实参放入一个元祖中
def func(*age):
print(age)
print(type(age))
# 分别取出每一个实参
for i in age:
print(i)
# 调用函数时,传入了多个参数
func("李四", 45, "china")
console:
('李四', 45, 'china')
<class 'tuple'>
李四
45
china
注:*变量名可以将传入的实参放入元祖中,可以通过遍历取出每一个实参。
3,2 **kwargs
可变参数的第二种形式
加了两个星号(**)的变量kwargs会存放所有的命名参数,即形如key=value的参数, kwargs为字典。
# **kwargs会把传进来的多个命名参数放入一个字典中
def func(**kwargs):
print(kwargs)
print(type(kwargs))
for key, value in kwargs.items():
print(key, value)
# 调用函数时,传入了多个参数
func(name="李四", age=45, weight=69, position="china")
console:
{'name': '李四', 'age': 45, 'weight': 69, 'position': 'china'}
<class 'dict'>
name 李四
age 45
weight 69
position china
注:
**变量名可以将传入的实参放入字典中,可以通过遍历取出每一个实参。
3,3可变参数的混合使用
代码示例1:
# 可变参数的混合使用
def func(a, b=2, c=3, *age, **kwargs):
print(a)
print(b)
print(age)
print(kwargs)
func(100, 200, 300, 400, 500, 600, pi=3.14, e=2.718)
# 这样的形式会报错,命名参数必须要写在最后
func(100, b=200, c=300, 400, 500, 600, pi=3.14, e=2.718)
注:
由于**kwargs是收集所有的命名参数,所以在函数的形参列表中只要有**kwargs,调用函数传递参数时,实参列表中的命名参数必须要写在最后。
代码示例2:
未完待续。。。。。。