函数的参数分为形参与实参
参数介绍:
# 函数为什么要有参数:因为内部的函数体需要外部的数据
# 怎么定义函数的参数:在定义函数阶段,函数名后面()中来定义函数的参数
# 怎么使用函数的参数:在函数体中用定义的参数名直接使用
形参:在函数的定义阶段 括号内写的变量名 叫做该函数的形式参数 简称 形参
实参:在函数的调用阶段 括号内实际传入的值 叫做实际参数 简称 实参
形参与实参的关系
形参就相当于变量名,而实参就相当于变量的值
函数调用传参的过程 就是给形参变量名赋值的过程
#形参本身没有意义,有实参赋予形参值后,该形参就具备了意义
# 补充:有默认值的形参,在没有被实参赋值,具备的是自身意义,但一旦被实参赋值,意义同实参
# 实参是有实际意义的参数
注意:
# 形参与实参可以重名,但是代表的是两个不同的变量
# 形参是对实参的值拷贝
# 形参实参为不可变类型,形参发生重指向,实参不变
# 形参实参可变类型,形参发生值的内部变化,实参变,两个指向的是同一个地址
# 形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除,只在函数内部有效 函数外部无任何影响
实参的分类
# 实参分为:1.位置实参 2.关键字实参
# 位置实参:传参一定按照位置,形参实参个数要一一对应进行传参
# 关键字实参:指名道姓进行传参,形参实参个数一致且位置可以改变进行传参 # 实参组合传参规则:必须先传位置实参,再传关键字实参
*与**的打散机制
# *单列容器 会打散单列容器
# **双列容器 会打散双列容器
在实参传参中使用*字符串,列表,元组,集合可以让多个值进行位置传参
*的内部可以看for循环将各字符或者元素传参
**可以将字典中各键值按关键字实参进行传参
形参的分类
# 六大分类:
# 1.无值位置形参(位置形参):可以被位置与关键字实参进行传参,必须传值
# 2.有值位置形参(默认形参):可以被位置与关键字实参进行传参,可以不用传参采用默认值
# 3.可变长位置形参 *agrs:会接受所有没有接收完的位置实参,接收的个数可以为0~n个,0个是就是空元组
# 4.无值关键字形参:只能由关键字实参进行传参,必须传值
# 5.有值关键字形参:只能由关键字实参进行传参,可以不用传参采用默认值
# 6.可变长关键字形参 **kwargs :会接收所有没有接收完的关键字实参,接收的个数可以为0~n个,0个是就是空字典
# 接收实参值顺序:
# 位置形参 > 默认形参 > 可变长位置形参 *agrs > 有无默认值关键字形参 > 可变长关键字形参 **kwargs
# 注意点:
# 1.可变长位置形参只能接受位置实参,要想被附上值,前面的有值位置形参的默认值没有多大意义
# 2.args与kwargs是可变长形参的变量名,所以可以自定义,但约定俗成就用它俩
# 使用法则:
# 1.所有位置形参全部采用位置实参进行传值
# 2.所有关键字形参全部采用关键字实参进行传值
# 3.不管位置还是关键字形参,全部按照顺序进行传参
补充知识点
# 命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参
# 在给命名关键字参数传值的时候 只能用关键字为其传值
def func(x,y=1,*args,z=3,m,**kwargs):
print(x,y)
print(args)
print(z,m)
print(kwargs)
func(1,2,3,4,5,6,7,8,9,0,z=69,m=999,o=666999,l = 999666)
# 在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错
# 其实z和m都是命名关键字参数 不是默认值参数和位置参数