"""
形参:在定义函数阶段,定义的参数 相当于变量
实参:在调用函数阶段,传入的数据 相当于变量值
调用阶段,实参会将自己指向的内存地址,赋值给形参
调用结束后,解除二者的绑定关系
"""
li = [12, 24, [13, 14]]
def func(para): # 形参
for i in para:
print(i, end=' ')
print('\r')
func('12,24') # 实参 --> 数据
func(li) # 实参 --> 变量
func(str(li)) # 实参 --> 函数的返回值
def add(x, y):
return x ** y
# 位置实参:按照位置依次传值
res1 = add(2, 8)
# 关键字实参:根据关键字指定传值
res2 = add(y=2, x=8)
print(res1, res2)
# 两种实参可混合使用,位置实参必须放在关键字实参前,不可重复传参
# 形参:在定义函数阶段,定义的参数
# 位置形参:必须被传值,且不可传入更多参数
def add(x, y):
return x ** y
# 默认参数:
# 在定义函数阶段,就已经被赋值的形参
# 位置形参必须在默认形参的左侧
# 作用:简化调用
def func(para=True):
if para:
print('我被默认执行了')
else:
print('默认形参被更改了')
func()
func(para=False)
# 在调用函数时,传入实参的值的个数不固定
# 针对溢出的位置实参和关键字实参,必须有对应的形参来接收
# 接收溢出的位置实参
# 其他参数会以元组的形式赋值给args
def func_tuple(x, y, *args):
print(x + y, args)
func_tuple(1, 2, 3, 4)
# 接收溢出的关键字实参
# 其他参数会以字典的形式赋值给kwargs
def func_dict(name, age, **kwargs):
print({'name': name, 'age': age}, kwargs)
func_dict('李白', 18, height=170, weight=60)
print('\n')
# *用在实参中 列表
# 先将*后面的值拆分为位置实参
def func_real1(x, y, z):
print(x, y, z)
func_real1(*[11, 22, 33])
# *用在实参中 字典 将key传入 传列表
def func_real2(x, y, z):
print(x, y, z)
func_real2(*{'name': '苏轼', 'age': 22, 'height': 170})
# **用在实参中 字典 将key与value传入 传字典 name = '苏轼'
def func_real3(name, age, height):
print(name, age, height)
func_real3(**{'name': '苏轼', 'age': 22, 'height': 170})
print('\n')
# 必须按照该顺序
# 位置形参 --> 默认形参 --> 可变长度位置形参[接收溢出的位置实参] -->
# 命名关键字形参 --> 可变长度关键字形参[接收溢出的关键字实参]
def func(x, y, z=0, *args, name='苏轼', age, **kwargs):
# 位置形参
print(x, y)
# 12 24
# 默认形参
print(z)
# 0
# 可变长度位置形参
print(args)
# (36, 48)
# 命名关键字形参:在定义函数时,*后定义的形参
print(name, age)
# 苏轼 18
# 可变长度关键字形参
print(kwargs)
# {'height': 170, 'weight': 52}
func(12, *[24, 0, 36, 48], name='李白', **{'age': 18, 'height': 170}, weight=52)
# 命名关键字实参,必须按照key=value的形式传值
# 如果没有设置默认值,则在调用时必须传入值
# 可接收任意参数
def func_out(*args, **kwargs):
func_in(*args, **kwargs)
def func_in(*args, **kwargs):
print(args, kwargs)
func_out(*[12, 24], **{'name': 'lili', 'age': 18})