函数的参数(总结)

一、形参与实参

形参:在函数的定义阶段使用的参数称之为形式参数,简称形参,类似与变量名。

def func(x, y):  # x,y都是形参
    print(x, y)

实参:在函数的调用阶段使用的参数称之为实际参数,简称实参,类似与变量值。

func(1,2) # 1,2都是实参

形参于实参的关系:

1、在调用阶段,实参(变量值)会绑定给形参(变量名)
2、这种绑定关系只能在函数体内使用
3、实参与形参的绑定关系在函数调用时生效,函数调用结束后解除绑定关系

实参的类型:

1.func(1,2)

2.

a=1
b=2
func(a,b)

3.

func(int('1'),2)
func(func1(1,2,),func2(2,3),333)

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

1.

位置形参:按照从左到右的顺序依次定义参数

在函数定义阶段,按照从左到右的顺序直接定义的"变量名"

特点:必须被传值,多一个不行少一个也不行

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

1.位置实参:在函数调用阶段,按照从左到右的顺序依次传入参数

特点:按照顺序与形参一一对应

func(1,2)
func(2,1)

2.

关键字实参:在函数的调用阶段,按照key=value的形式传入的参数

特点:可以不按照顺序传

位置实参和关键字实参(混合使用):

# 位置实参必须在关键字实参前
func(1,y=2)
func(y=2,1) # error
# 不能为同一个形参重复传值
func(1,y=2,x=3)
func(1,2,x=3,y=4)

3.

默认参数:在函数的定义阶段,就已经被赋值了的参数,称之为默认参数。

特点:因为在定义阶段就已经被赋值了,所以在调用阶段可以不为其赋值。

def register(name,age,gender='男'):
    print(name,age,gender)

register('三炮',18)
register('二炮',19)
register('大炮',19)
register('没炮',19,'女')

位置形参与默认形参(混合使用)

1.位置形参必须在默认形参的左边

def func(y=2,x):
    pass

2.默认参数在函数的定义阶段就已经被绑定内存地址

m=2
def func(x,y=m): # y=>2的内存地址
    print(x,y)
m=3333333333333333333 # 并不会受到影响
func(1)
# 1 2

由于可变类型的特性上面这种方法并不适用

ps:不推荐使用可变类型

m = [111111, ]

def func(x, y=m):  # y=>[111111, ]的内存地址
    print(x, y)

m.append(3333333) # 列表是可变类型,所以该操作不改变内存地址
func(1)

三、可变长度的参数(*与**的用法)

可变长度指的是在调用函数时,传入的值(实参)的个数不固定。 而实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收。

1.长度可变的位置参数

*的位置形参:

用来接收溢出的位置实参,溢出的位置实参会被*保存为元组的形式,然后赋值给*后面的形参名

*后可以跟任意名字,但是约定俗成使用args

# 混合使用
def func(x,y,*z): # z =(3,4,5,6)
    print(x,y,z)

func(1,2,3,4,5,6)
# 单一使用
def my_sum(*args):
    res=0
    for item in args:
        res+=item
    return res

res=my_sum(1,2,3,4,)
print(res)

*的实参使用:

实参中带*的,先*后的值会被打散成位置实参

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

func(*[11,22,33]) # func(11,22,33)
func(*[11,22]) # func(11,22)  # error
l=[11,22,33]
func(*l)

*在实参和形参中的混合使用

def func(x,y,*args): # args=(3,4,5,6)
    print(x,y,args)

func(1,2,[3,4,5,6])
func(1,2,*[3,4,5,6]) # func(1,2,3,4,5,6)
func(*'hello') # func('h','e','l','l','o')


**的使用(适用长度可变的关键字参数)

**的形参名:用来接收溢出的关键字实参,**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参名,**后跟的可以是任意名字,但是约定俗成应该是kwargs。

**用在实参中(**后只能跟字典),实参中带**会被打伞成关键字实参的形式。

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

func(*{'x':1,'y':2,'z':3}) # func('x','y','z') 
func(**{'x':1,'y':2,'z':3}) # func(x=1,y=2,z=3)

错误示范:

def func(x,y,z):
    print(x,y,z)
    
func(**{'x':1,'y':2,}) # func(x=1,y=2) --->少参
func(**{'x':1,'a':2,'z':3}) # func(x=1,a=2,z=3) --->不对应

**的混用(实参与形参)

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

func(y=222,x=111,a=333,b=444)
func(**{'y':222,'x':111,'a':333,'b':4444})
# 两种结果相同
# 111 222 {'a': 333, 'b': 4444}

***的混合使用

注意:*args必须在**kwargs之前。

def func(*args,**kwargs):
    print(args)
    print(kwargs)

func(1,2,3,4,5,6,7,8,x=1,y=2,z=3)

混合调用:

def index(x,y,z):
    print('index=>>> ',x,y,z)

def wrapper(*args,**kwargs):
    #args=(1,) kwargs={'z':3,'y':2}
    index(*args,**kwargs)
    index(*(1,),**{'z':3,'y':2})
    index(1,z=3,y=2)

# wrapper(1,z=3,y=2) # 为wrapper传递的参数是给index用的
# 原格式---》汇总-----》打回原形

了解知识点:

1.命名关键字参数

在定义函数时,*后定义的参数,如下所示,称之为命名关键字参数

特点:命名关键字实参必须按照key=value的形式为其传值

def func(x,y,*,a,b): # 其中,a和b称之为命名关键字参数
    print(x,y)
    print(a,b)

# func(1,2,b=222,a=111)

2.混合使用

形参混用的顺序:位置新参,默认形参,*args,命名关键字形参,**kwargs

def func(x,y=111,*args,z,**kwargs):
    print(x)
    print(y)
    print(args)
    print(z)
    print(kwargs)

一般的传参形式:

func(1)
func(x=1)
func(1,x=1)
func(*'hello')
func(**{})
func(*'hell',**{})

猜你喜欢

转载自www.cnblogs.com/bailongcaptain/p/12547721.html