函数的参数
函数的参数分为形参与实参
参数介绍: # 函数为什么要有参数:因为内部的函数体需要外部的数据 # 怎么定义函数的参数:在定义函数阶段,函数名后面()中来定义函数的参数 # 怎么使用函数的参数:在函数体中用定义的参数名直接使用 形参:在函数的定义阶段 括号内写的变量名 叫做该函数的形式参数 简称 形参 实参:在函数的调用阶段 括号内实际传入的值 叫做实际参数 简称 实参 形参与实参的关系 形参就相当于变量名,而实参就相当于变量的值 函数调用传参的过程 就是给形参变量名赋值的过程 #形参本身没有意义,有实参赋予形参值后,该形参就具备了意义 # 补充:有默认值的形参,在没有被实参赋值,具备的是自身意义,但一旦被实参赋值,意义同实参 # 实参是有实际意义的参数 注意: # 形参与实参可以重名,但是代表的是两个不同的变量 # 形参是对实参的值拷贝 # 形参实参为不可变类型,形参发生重指向,实参不变 # 形参实参可变类型,形参发生值的内部变化,实参变,两个指向的是同一个地址 # 形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除,只在函数内部有效 函数外部无任何影响
实参的分类
# 实参分为: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都是命名关键字参数 不是默认值参数和位置参数