python中的函数(二)

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:
未完待续。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章