一、形参和实参:
形参:在函数定义阶段定义的参数,称之为形式参数(相当于变量名)。
def func(x,y):
print(x,y)
实参:在函数调用阶段传入的值,称之为实际参数(相当于值)。
func(1,2)
两者关系:
1、在调用阶段,实参(变量值)会绑定给形参(变量名);
2、这种绑定关系只能在函数体内使用;
3、绑定关系在函数调用时生效,调用结束解除绑定。
二、实参的形式
实参虽然是传入的值,但是形式可以是以下形式:
形式一:
func(1,2)
形式二:
a=1
b=2
func(a,b)
形式三:
func(int(“1”),2)
func(func1(1,2),func2(2,3),33)
三、参数的具体使用:
3.1位置参数:
位置形参:按照从左到右的顺序直接定义的“变量名”
特点:必须被传值,多一个,少一个都不行
def func(x,y):
print(x)-----×
print(x,y,z)-----×
print(x,y)-----√
位置实参:按照从左到右的顺序依次传入的“值”
特点:按照顺序与形参一一对应
func(1,2)------ x——1,y——2
func(2,1)------y——1,x——2
3.2关键字参数
关键字实参:在函数调用阶段,按照key=valuse形式传入:
特点:指名道姓给摸个形参传数,可以不参照顺序:
def func (x,y):
print(x,y)
func(y=1,x=2)
3.3默认参数
默认形参:在定义函数阶段,就已经被赋值的形参。
特点:在定义阶段已经被赋值意味着在调用阶段可以不用为其赋值。
def func (x,y=3):
print(x,y)
func(x=1)-------大多数情况下可以直接写成这样
func(x=1,y=2)-------特殊情况可以进行从新赋值
位置形参和默认形参的混合:
1、位置形参必须在默认形参的左边
def func(x,y=2):
2、默认形参的值:在定义阶段被赋值
不可变类型:
m=2def func(x,y=m):
print(x,y)
m=333
func(1)
》》》》1 2
可变类型:
m=[2, ]def func(x,y=m):
print(x,y)
m.append(333)
func(1)
y=m是y等于m的内存地址。
虽然默认值可以被指定成任意类型,但是我们不推荐使用可变类型;
函数的最理想:函数的调用只跟函数本身有关,不受外界代码的影响。
实际需要可以选择这样表达:
![e827ab28778f617899d2b3f5fde7a464.png](https://i-blog.csdnimg.cn/blog_migrate/52b3e3f7b65144df097a589b4e25f0ec.png)
3.4可变长度的参数(*和**)
可变长度指的是在调用阶段,传入的值得个数不固定
而实参是用来形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收
3.4.1 可变长度的位置参数
一、*形参名:用来接收溢出的位置实参,溢出的位置实参会被*保存成元组的格式然后赋值紧跟其后的形参名
*后跟的可以是任意名字,但是约定俗成应该是args
例:
def func (x,y,*args):
print(x,y,args)
func(1,2,3,4,5,6)# >>> 1 2 (3, 4, 5, 6)
应用:求几个数字的和
![f73868aa7eb1632ad4de509ec03abe82.png](https://i-blog.csdnimg.cn/blog_migrate/2b791d918adb567e4703e438f51173fe.png)
二、*可以用在实参中,实参中带*,先*后的值打散成位置实参
![f9f8687a8330e75cf43efcf9e398a3fc.png](https://i-blog.csdnimg.cn/blog_migrate/288960a5170f760afa4736d44df367da.png)
三、形参和实参都带*
![87648b18719719dae32c14f6d6c3430d.png](https://i-blog.csdnimg.cn/blog_migrate/d6f9171c2330ca4dc437a839fbdd3452.png)
3.4.2 可变长度的关键字参数
一、**形参名:用来接收溢出的关键字实参,**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参名
**后跟的可以是任意名字,但是约定俗成应该是kwargs
例:
![21ad606e6ba6ecc24b6536daf7a1847b.png](https://i-blog.csdnimg.cn/blog_migrate/f6fbc5422f7a14ff251757c24b025b49.png)
二、**可以用在实参中(**后跟的只能是字典),实参中带**,先**后的值打散成关键字实参
![819f4a39ab4a13d6522dcd27fafad90d.png](https://i-blog.csdnimg.cn/blog_migrate/2fbe693fbdc12b2f8a5744690a758a37.png)
三、形参和实参都带**
![09a1f7af1f86feb901550255fc622d47.png](https://i-blog.csdnimg.cn/blog_migrate/8c1afc9852515f9a1ca1748414ede549.png)
四 、*和** 混合用:
*args必须在** kwargs前
例一:
![db07ecefcc3edf0e6cc5c4272f1504ea.png](https://i-blog.csdnimg.cn/blog_migrate/e2b8377ba65c4c261e6c520c519be613.png)
例二:
![7aef1087c68d8b6791fbc380ae79cc34.png](https://i-blog.csdnimg.cn/blog_migrate/029403263c1a9d63438a1f43b723fe83.png)