【参数的介绍】
1 形参:相当于没调用之前的x,y 实参:调用之后输入的x,y的值 2 实参与形参的绑定关系再函数调用的时候生效,函数调用结束后解除绑定关系 3 位置形参:再函数定义阶段,按照从左到右的顺序直接定义的“变量名”,必须被传值 4 位置实参:再函数调用阶段,按照从左到右的顺序依次传入的值,按照顺序与形参一一对应 5 关键字实参:在函数调用阶段,按照key=value的形式传入的值,指名道姓的给某个形参传值,不用参照顺序 6 关键字实参和位置实参混用; 7 1, 位置实参必须放在关键字实参前 8 def unf(x,y): 9 print(x,y) 10 unf(1,y=3) 正确的 11 unf(y=3,1) 错误的 12 2.不能为同一个形参传值 13 unf(1,y=3,x=2) 错误
14 默认形参:在定义的阶段,就已经被赋值的形参,意味着在调用阶段可以不用为其赋值 15 def unf(x,y=2): 形参已经被赋值 16 print(x,y) 17 unf(1) # x=1,y=2 如果调用时,想输入Y值,却与之前形参赋值时不同,最后调应结果以调应时候的值为准 18 位置形参和默认形参混用:1,位置形参必须在默认形参的左边 19 2.默认参数的值是在函数定义阶段被赋值的,准确的说是被赋予的是值的内存地址 20 3.虽然默认值可以被指定为任意数据类型,但是不推荐使用可变类型 21 22 # 2的案例一: 23 m = 2 24 26 def unf(x, y=m): 27 print(x, y) 28 30 m = 222 31 unf(1, m) # m=222=y 32 33 # # 2的案例二:可变类型 34 m = [11, ] 35 37 def unf(x, y=m): 38 print(x, y) 39 41 m.append(222) 42 unf(1)
【可变长度的参数】
1 可变长度的参数:在调用函数时,传入的值(实参)的个数不固定,而实参是用来为形参赋值的,所对应着,针对溢出来的实参必须有对应的形参来接收 2 1,用来接收溢出来的位置实参,溢出来的位置实参会被*保存成元组格式然后赋值给紧跟其后的形参名:*+形参名 3 def unf(x,y,*z): z=(3,4,5,6) 4 print(x,y,z) 5 unf(1,2,3,4,5,6) 6 案例:求和: 7 def my_sun(*x): 核心是* 8 res=0 9 for item in x: 10 res+=item 11 return res 12 res=my_sum(1,2,3,4) 13 print(res) 返回值=1+2+3+4=10 14 15 2.用来接收溢出来的关键字实参,**会将溢出来的关键字实参保存成字典形式,然后赋值给紧跟其后的形参名:**+实参名 16 def unf(x,y,**name): 17 print(x,y,name) 18 unf(1,y=2,a=3,b=4,c=5) **name=a,b,c
1.可变长度的参数用在实参中:* (*是代表位置参数)
1.2位置参数:实参,形参都带*
1.3关键字参数**用在实参中;
1.4关键字参数;实参、形参当中都带**
*和**混用
.
。
。
【命名关键字参数】
1 形参必须按照关键字参数传值,这种行参就叫作:命名关键字参数 2 3 def index(x, y,*, a,b): #a和b就是命名关键字参数 4 print(x,y,a,b) 5 6 index(1,2,a=3,b=4) 7 这种情况下代码运行没有问题 8 9 ------------------------------------------------------------ 10 11 def index(name, gender='male',*args, **kwargs): 12 print(name, gender,args, kwargs) 13 index('jason',1,2,3,a=111) 14 这种情况下就不对了结果为: 15 默认参数的传值是有就用传的值,没有就用默认参的值,此时会把1当成gender需要的值直接赋值给它了, 16 我们想的是不传值给默认形参的。 17 18 19 这时候index('jason',gender='male',1,2,3,a=111) # 语法错误,因为这时候位置参数在后面了,语法还是有问题。 20 21 index('jason',1,2,3,gender='male',a=111) 22 # 还是不行,1直接赋值给了默认形参了,而且gender='male'相当于被赋值两次了,还是语法有问题。 23 24 25 这时候把定义阶段的默认参数位置换一下,这时候可以理解为*args的优先级在默认参数前面了, 26 当第一个'jason'传给name以后,系统就认为没有普通行参了, 27 开始执行:*号接收实参中多余的位置参数组成元组赋值给后面的变量名。*args执行完了, 28 发现还有默认参数时,此时1, 2, 3, 4已经被接收了,没有位置参数给他传值了, 29 所以只能用自己的默认参数了。这种情况下gender='male'就叫作命名关键字参数, 30 也就是说你在调用函数时,输入的参数里面要想给形参中的默认参数gender='male'传值,必需时gender=XXXX 31 这种形式指名道姓的告诉形参中的默认参数,我要传值给你了,否则就无法将值传给默认参数。 32 33 def index(name, *args, gender='male',**kwargs): # gender='male'就是命名关键字参数 34 print(name, gender,args, kwargs) 35 index('jason', 1, 2, 3, 4, a=1, b=2) 36 这样就行了,调用阶段会用gender的默认参数结果为: 37 jason(1,2,3,4)male {'a':1,'b':2 } 38 如果想改gender的默认值就只能这样写 39 index('jason', 1, 2, 3, 4,gender='female' , b=2) 40 41 代码如果这样写,把gender去掉就出问题了,'female'会被当做多余的位置参数被*号给接收了 42 index('jason', 1, 2, 3, 4,'female' , b=2)