11、函数的参数

一、函数参数分为两大类

1、形参:在函数定义阶段括号内定义的变量名,称之为形式参数,简称形参
2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参

形参与实参的关系是:
   在调用有参函数时,实参(值)会赋值给形参(变量名),然后可以在函数内使用,函数调用完毕后,解除绑定

二、形参与实参的具体使用

1、位置形参

在函数定义阶段按照从左到右的顺序依次定义的形参,称之为位置形参
特点:必须被传值,多一个不行少一个也不行

def reg(name, age, sex):  # 定义位置形参:name,age,sex,三者都必须被传值
    print('Name:%s Age:%s Sex:%s' % (name, age, sex))


reg('poco', 18, 'male')

2、默认形参

在函数定义阶段就已经为某个形参赋值了,称之为默认形参
特点:在函数定义阶段就已经赋值了,意味着在调用阶段可以不用为其赋值

def reg(name, age, gender="男"):
    print('姓名:%s  年龄:%s  性别:%s' % (name, age, gender))

# 调用阶段
reg("李铁蛋", 28)
reg("张全蛋", 25)
reg("赵金蛋", 21)
reg("孙翠花", 18, "女")
""" 比如说上面的案例,一个班大部分都是男性,那么我们就可以提前在形参上提前赋值,调用时就不用为其赋值,降低了函数调用的复杂度需要注意:默认参数必须在位置参数之后,默认参数的值仅在函数定义阶段被赋值一次默认形参的值通常应该是不可变类型 """

3、位置实参

在函数调用阶段按照从左到右的顺序依次传入的值,称之为位置实参
特点:按照顺序与形参一一对应

def func(x, y):
    print(x)
    print(y)


func('天地', '玄黄')
func('宇宙', '洪荒')

4、关键字实参

在函数调用阶段按照key=value的格式传入的值,称之为关键字实参
特点:可以打乱顺序,但是仍然能够为指定的形参赋值


ps:可以混用位置实参与关键字实参,但是
1、位置实参必须在关键字实参前
2、不能为同一个形参重复赋值

def func(x,y):
    print(x)
    print(y)

func(y = '玄黄', x = '天地')
func('宇宙',y = '洪荒')

三、可变长的参数

可变长的参数:可变长指的是在函数调用阶段,实参的个数不固定,而实参是为形参赋值的,
所以对应着必须要有一种特殊格式的形参能用来接收溢出的实参

通常我们把可变长的参数命名为*args与**kwargs,下面我们看看具体的应用

1、形参中带*

*会接受溢出的位置实参,然后将其存成元组,然后赋值给紧跟其后的变量名

案例1

# 定义阶段
def func(x,*args):
    print(x)
    print(args)
# 调用阶段
func(1,2,3,4,5,6)
# 运行结果
1
(2, 3, 4, 5, 6)

案例2

# 定义阶段
def my_sun(*args):
    res = 0
    for num in args:
        res += num
    print(res)

# 调用阶段
my_sun(1, 2, 3, 4, 5)
my_sun(1, 2)

# 运行结果
15
3

2、形参中带**

**会接收溢出的关键字实参,然后将其存成字典,然后赋值给紧跟其后的变量名

# 定义阶段
def func(x, **kwargs):
    print(x)
    print(kwargs)

# 调用阶段
func(1, a=1, b=2, c=3)
# 运行结果
1
{'a': 1, 'b': 2, 'c': 3}

3、实参中带*

*后跟的必须是一个可以被for循环遍历的类型,*会将实参打散成位置实参,不过要注意:形参中只有三个参数,所以实参里可被遍历的元素也只能是三个

# 定义阶段
def func(x, y, z):
    print(x)
    print(y)
    print(z)

# 调用阶段
func(*[11, 22, 33])
# 运行结果
11
22
33

4、实参中带**

**后跟的必须是一个字典,**会将实参打散成关键字实参,

# 定义阶段
def func(x, y, z):
    print(x)
    print(y)
    print(z)

# 调用阶段
func(**{"x": 1, "y": 2, "z": 3})  # func(z=3,x=1,y=2)
# 运行结果
1
2
3

额外小知识

*args加上**kwargs可以存放任意的实参

def index(x, y, z):
    print(x, y, z)


def wrapper(*args, **kwargs):
    index(*args, **kwargs)


wrapper(1, z=3, y=2)

调用wrapper函数,但实际上 实参里的数 给了index,这涉及到后面装饰器的知识

posted @ 2021-03-26 21:59  黑影Poco  阅读(217)  评论(0)    收藏  举报