函数基础三 位置形参默认形参可变形参

细分:
1.位置参数:
1.1位置形参:在定义阶段,按照从左到右的顺序依次定义的形参称为位置形参
特点:但凡是按照位置定义的形参必须被传值 多一个不行少一个也不行
def func(x,y,z)
print(x,y,z)
func(1,2)
func(1,2,3)
func(1,2,3,4)

1.2位置实参:在调用阶段,按照从左到有的顺序依次传入的值称为位置实参
特点:
与形参一一对应
def func(x,y,z)
print(x,y,z)
func(2,1,3)

2.关键字实参:在调用阶段 按key=value的形式定义的实参称之为关键字实参
特点:可以完全打乱顺序 但仍能为指定的形参传值(总结:指名道姓地为指定的形参传值)
def func(x,y,z)
print(x,y,z)

func(x=1,y=2,z=3)
func(z=3,y=2,x=1)
实参的形式可以是位置实参与关键字实参混合使用 但是必须遵循原则
1.位置实参必须放在关键字实参前面
2.不能对同一个形参重复赋值
func(1,z=3,y=3)
func(z=3,1,y=2)#报错 从右往前的原则
func(1,z=3,x=2,y=3)报错 x重新赋值

3.默认形参:在定义阶段就已经为形参赋值 该形参称之为默认参数
特点:
1.定义阶段已经有值意味着调用阶段可以不用传值
2.位置形参必须放到默认形参的前面
3.默认形参的值在函数的定义阶段已经固定 定义阶段之后不会改变函数值
4.默认形参的值应该是不可变类型

def func(x,y,z=100):
print(x,y,z)
func(10,20)
func(10,20,200)

def register(name,age,sex='male'):
print(name,age,sex)

register('egon',18)
register('sad',38)
register('qwe',48)
register('mda',28,'female')

下面的是错误的
def func(x,z=100,y):
print(x,y,z)

m=10
def func(x,y,z=m)
print(x,y,z)
m=100
func(1,2)

def add_hobby(name,x,hobbies=None):
if hobbies is None:
hobbies=[]
hobbies.append(x)
print('%s的爱好有%s'%(name,hobbies))

add_hobby('egon','read')
add_hobby('wxx','eat')
add_hobby('alex','poap')

4.可变长参数:
可变长实参 指的是在调用阶段,实参的值个数是不固定的
实参无非两种形式(位置,关键字实参)对应着形参也必须要有两种解决方案来分别接受溢出位置实参或者关键字实参
*-------->溢出的位置实参
**-------->溢出的关键字实参
求类和
def sum2(*x):
res=0
for i in x:
res+=i
return res
print(sum2(1,2,3,4,5))

4.1*的用法
在形参前加*,*会将溢出的位置实参存成元祖的形式 然后赋值给*后的形参名
def func(x,y,*z):
print(x,y,z)
func(1,2,3,4,5)
结果为1 2 (3, 4, 5)
func(1,2,a=3,b=4,c=5)#这样写会报错


在实参钱加*:但凡碰到实参中带*的,先将实参打散成位置实参再与形参对应
def func(x,y,z):
print(x,y,z)
func(1,2,[3,4,5])
func(*[1,2,3,4,5])#func(1,2,3,4,5) 这个不成立 参数过多
func(*[1,2,3])

def func(x,y,*z):
print(x,y,z)
func(*[1,2,3,4,5])
这样就没问题

def func(x,y,*z):
print(x,y,z)
func(1,2,*[3,4,5])


4.2**的用法
在形参前加**:**会将溢出的关键字实参存成字典的形式 然后赋值给**后的形参名
def func(x,y,**z):
print(x,y,z)

func(1,2,a=3,b=4,c=5)
结果为1 2 {'a': 3, 'b': 4, 'c': 5}

def func(x,y,z):
print(x,y,z)
func(1,**{'y':2,'z':3})
实参中带**只有字典才能满足固定类型的传参

func(1,**{'a':2,'y':2,'z':3})#错误 参数不匹配

def func(x,y,**z):
print(x,y,z)
func(**{'y':1,'x':2,'a':111,'b':222})

形参中你那个:args,**kwargs
def func(x,*args)
print(x)
print(args)

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


*与**的应用
def index(name,age,sex):
print('index====>',name,age,sex)


#会将wrapper函数接收的参数格式会原封不动地转嫁给其内部的index函数,必须是遵循index的参数规则
def wrapper(*args,**kwargs):
print(args)
print(kwargs)

wrapper(1,2,3,4,5,6,a=1,b=2,c=3)
结果为
(1, 2, 3, 4, 5, 6)
{'a': 1, 'b': 2, 'c': 3}


def index(name, age, sex):
print('index====>', name, age, sex)


def wrapper(*args, **kwargs):
print(args)
print(kwargs)
index(*args, **kwargs)
wrapper('egon',sex='male',age=18)

原文地址:https://www.cnblogs.com/liugangjiayou/p/11624412.html