标签:border for 函数的参数 cap 调用 函数定义 class 生效 name
形参:在函数的定义阶段使用的参数称之为形式参数,简称形参,类似与变量名。
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‘,**{})
标签:border for 函数的参数 cap 调用 函数定义 class 生效 name
原文地址:https://www.cnblogs.com/bailongcaptain/p/12547721.html