【参数的介绍】

 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)

 

posted on 2023-11-16 00:05  认真的六六  阅读(4)  评论(0编辑  收藏  举报