形参变量:只在函数内部有效,只在调用时分配内存,调用结束即刻释放,函数调用结束返回主调用函数后则不能再使用该形参变量
实参:可以是常量、娈量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使参数获得确定值
一、位置参数:
调用函数时根据函数定义的参数位置来传递参数。
上图中的name,age,country,course都是位置参数,在调用该函数的时候传参的参数位置要和函数定义的参数位置一一对应,并且参数的个数也要相同
二、默认参数:
上图中我们发现在调用该函数时候,给country传的参数的值都是“CN”,那在调用的时候是否可以省略不写但默认生成的就是"CN",从而在编写程序的时候少写代码?
答案是肯定的,可以将country参数定义一个默认的值“CN”,不传值给参数country的时候就是“CN”,传了就是传了的值:
此时的country就由位置参数变成了默认参数
前两个调用的时候并没有传值给参数country,但都打印出CN,这就是默认参数的功能
值得注意的是默认参数和位置参数的位置关系:默认参数的位置必须在位置参数的后面(这里的位置是定义函数时的参数位置)
三、关键参数
调用函数的时候,通过“键-值”形式加以指定。
上图中位置参数age、course和默认参数country都变成了关键参数,不用再按照位置传参
但是与参数name的位置相对应的参数‘Alex’依旧是位置参数,并没有直接指定
值得注意的是关键参数的位置必须在位置参数的后面,但关键参数之间可以没有顺序(这里的位置是指调用函数时传参的参数位置)
四、非固定参数
定义函数的时候,有时候我们不确定调用的时候会传递多少个参数(也可能不会传值),此时可以将多个位置参数或关键参数打包再传递
结果:
*args(元组),接收的参数可以是多个位置参数或列表、元组
**kwargs(字典),接收的是该函数中未定义的关键字参数或字典
- *args传参方式:
1、多个位置参数
结果:
第一个位置参数‘hello’传给msg后,剩下的所有位置参数都会被打包成元组传给*users(此处的users只是便于理解,规范的应该写成*args)
如果形式参数中参数的前面出现了*号,那传递的参数就可以不再是固定个数,传递的参数就会被打包成元组发送给该形参
2、列表或者元组
结果:
传递的列表或者元组前面加一个*号后,这个列表或元组里的所有元素就会传给*args这个元组形式的参数
但如果传的列表或元组前不加*号,那传入的列表或者元组整体会被当成元组里的第一个元素:
结果:
值得注意的是非固定参数的位置放在位置参数的后面为宜(这里的位置是指定义函数时的参数位置)
当然也可以放在位置参数前面,只不过在调用函数传参的时候,后面的位置参数要变成关键参数来传递:
- **kwargs传参方式:
1、函数中未定义的关键字参数
结果:
2、传入字典
结果:
字典前必须加**,如果只是一个*就会出现整个字典被当作一个元素传递给*users(*args)元组
总结:1、函数在定义和调用时应遵循依次是位置参数,默认参数,*args,**kwargs的顺序(定义和调用都应遵循)
2、非固定参数可以不传值