函数第二天
形参:在定义函数时的参数
实参:在调用函数时的参数
形参与实参的关系:
- 在调用时实参会绑定形参
- 绑定关系只能在函数体内使用
- 实参与形参的绑定关系只有调用时生效,而调用结束后则解除绑定关系
实参传值:
# 形式一: func(1, 2) # 形式二: a = 1 b = 2 func(a, b) # 形式三: func(int('1'), 2)
形参与实参的使用:
位置参数:
位置形参:在函数定义时,按照从左到右的顺序定义
特点:必须被传值,形参有几个值,就要传入几个值
位置实参:调用时按照从左到右的顺序依次传值
特点:按照形参顺序对应传值
def func(x,y): print(x,y) func(1,2)
关键字参数:
关键字形参:在函数调用时按照 keys 与 value 的形式传值
特点:根据“变量名”传值且可以不按照顺序传值
def func(x,y): print(x,y) func(y=2,x=1)
位置参数与关键字参数的混合使用:
1,位置实参必须放在关键字实参前
func(1,y=2)
2,不能同时给同一个形参传多个值
func(1,y=2,x=3) #错误的演示
默认参数:在定义函数时就已经被赋值的形参
特点:定义时被赋值了调用时就可以不用赋值,当然也可以在重新赋值
def func(x,y=3): print(x,y) func(x=1,y=44444)#y在形参定义时已经赋值了,但是调用函数时也可以在重新赋值
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=3333333333 func(1)
3,默认值可以指定任意类型,但是不推荐使用可变类型,因为这样会使整个函数的逻辑关系变的混乱。
函数理想的状态:函数的调用只跟函数本身有关系,不被外界代码影响。
def func(x,y,z,l=None): if l is None: l=[] l.append(x) l.append(y) l.append(z) print(l) func(1,2,3) func(4,5,6) new_l=[111,222] func(1,2,3,new_l)
可变长度的参数(*与**的用法)
可变长度指的是在调用函数时,传入的值(实参)的个数不固定
而实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收
可变长度的位置参数
I:*形参名:用来接收溢出的位置实参,溢出的位置实参会被*保存成元组的格式然后赋值紧跟其后的形参名
*后跟的可以是任意名字,但是约定俗成应该是args
def my_sum(*args): res=0 for item in args: res+=item return res res=my_sum(1,2,3,4,) print(res)
II: *可以用在实参中,实参中带*,先*后的值打散成位置实参
def func(x,y,z): print(x,y,z) # func(*[11,22,33]) # func(11,22,33) # func(*[11,22]) # func(11,22) l=[11,22,33] func(*l)
III: 形参与实参中都带*
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')
可变长度的关键字参数
I:**形参名:用来接收溢出的关键字实参,**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参名
**后跟的可以是任意名字,但是约定俗成应该是kwargs
def func(x,y,**kwargs): print(x,y,kwargs) func(1,y=2,a=1,b=2,c=3)
II: **可以用在实参中(**后跟的只能是字典),实参中带**,先**后的值打散成关键字实参
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)
III: 形参与实参中都带**
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})
混用*与**:*args必须在**kwargs之前
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)