函数参数看似很平常,在深究后发现其中还是有很多东西,参数分类、用法和新特性等,都可以体会到Python是真的灵活好用。
参数分类
一,定义与使用角度
形参:函数定义时定义的参数。
实参:函数调用时传入的参数。
参数传递的过程,就是把实参的引用传递给形参,使用实参的值来执行函数体的过程,形参的定义决定了实参传入方式。
def print_num(num): print(num) a = 10 print_num(a) # 实参引用传递給 形参 num
二,传参方式角度
Python 传参方式有两种:
按位置顺序传参:调用时根据参数位置顺序传递,包括位置参数、默认参数(缺省参数)和可变参数
按关键字传参:调用时以“关键字=值”形式传递参数,包括关键字参数
1,位置参数
按照声明时的位置顺序关系依次传递参数,形参与实参的数量、顺序、数据类型必须对应,否则报错。
def locationParams(m,n): print('第一个参数',m) print('第一个参数',n) locationParams(1,2)
2,默认参数
定义函数时,为某个参数赋予一个默认值,具有默认值的参数称为默认参数
def defaultParams(m,n='xiaoming'): print('第一个参数',m) print('第一个参数',n) defaultParams('Hello','xiaoli') defaultParams('Hello') #未传入默认参数 """ 第一个参数 Hello 第二个参数 xiaoli 第一个参数 Hello 第二个参数 xiaoming """
Tips:
(1)默认参数不能在非默认参数之前,Python 按照顺序传参,无法识别默认参数,声明函数时,也会报错:
SyntaxError: non-default argument follows default argument
def defaultParams(m='xiaoming',n): print('第一个参数',m) print('第二个参数',n) defaultParams('Hello') #Python 按照顺序传参,那么没有实参会传递给形参n
(2)默认参数不能时可变参数,默认参数的值时固定的,如果是可变参数,则参数值会被修改。
def f(a,l=[]): l.append(a) return l print(f(1)) print(f(2)) print(f(3)) ## 默认参数l为list,其对应的值也被修改了 """ [1] [1, 2] [1, 2, 3] """
3,可变参数
可变参数是指参数个数是可以变化的,可以是0、1或多个,可变参数定义时符号“ * ” 表示。在函数调用时,可变参数接收的实参会被封装成一个元组。
def variableParams(*params): print("参数: ",params) sum = 0 for i in params: sum+=i print(sum) variableParams() # 不传入参数 variableParams(1,2,3,4) # 传入多个参数 num_list = [1,2,3,4] variableParams(*num_list) # num_list 加上“*” 将num_list拆解,否则num_list被当成一个参数传入 variableParams(num_list[0],num_list[1])
"""
参数: () # 元组
0
参数: (1, 2, 3, 4) # 元组
10
参数: (1, 2, 3, 4) # 元组
10
参数: (1, 2)
3
"""
4,关键字参数
关键字参数与可变参数类似,参数的个数都是可变的,所以也被称作可变关键字参数。
关键字参数与可变参数区别
(1)关键字参数会被封装成一个字典,可变参数接收的实参会被封装成一个元组。
(2)函数调用时,关键字参数以以“关键字=值”形式传递参数
def keyWordParams(**params): print(params) keyWordParams() ## 不传参数 keyWordParams(name='xiaoming',age='11',gender='male') ## 关键字传参 person_info = {'name': 'xiapli', 'age': '20', 'gender': 'male'} keyWordParams(**person_info) # **person_info 将字典拆分 """ {} {'name': 'xiaoming', 'age': '11', 'gender': 'male'} {'name': 'xiapli', 'age': '20', 'gender': 'male'} """
四类参数可以混合使用,但在声明时,需要注意顺序:位置参数、默认参数、可变参数和关键字参数。否则Python将无法正常解析。
三,参数新特性
1,仅位置参数
Python3.8 新特性中,新增了仅位置参数。**新的函数参数语法 使用 “ / ” 指明有些函数参数必须被指定为位置参数, 不能被用作关键字参数。 仅位置参数 在“ / ”之前,“ / ”之后可以是任意类型参数 **
def pos_only(a,/): print(a) pos_only(1) # 1 pos_only(a=1) # TypeError: pos_only() got some positional-only arguments passed as keyword arguments: 'a'
2,仅关键字参数(命名关键字参数)
与仅位置参数,对应的是仅关键字参数,不过并非Python3.8 新特性,仅关键字参数也被称为命名关键字参数。声明函数时,在第一个关键字形参前添加“ * ”,表明必须以关键字参数形式传参。
def stu_info(name,gender,*,age,city): print('name is:',name,' gender is:',gender,' age:',age,' city:',city) stu_info('Bob','M',age=7,city='TJ') stu_info('Lucy','F',city='BJ',age=10)
关键字参数和命名关键字参数的区别在于,前者可以传递任何名字的参数,而后者只能传递 后面名字的参数。
stu_info('Lucy','F',city='BJ',addr=10) # stu_info() got an unexpected keyword argument 'addr'
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个“ * ”了
#args可以传递一个tuple 其后只能传递age和city参数 def stu_info(name,gender,*args,age,city): print('name is:',name,' gender is:',gender,' age:',age,' city:',city) for i in args: print('args:',i) stu_info('Bob','M',age=7,city='TJ') stu_info('Lucy','F',(2,3),city='BJ',age=10) """ name is: Bob gender is: M age: 7 city: TJ name is: Lucy gender is: F age: 10 city: BJ args: (2, 3) """
最后几个题目,大家可以测试下是否掌握:
def function1(a, b, c=0, *arg, **kw): print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw) function1(1,2,3,4,5,A=1,B=2) # a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2} def function2(a,/, b, c=0, *arg, **kw): print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw) function2(1,2,3,4,5,A=1,B=2) # a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2} def function3(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) function3(1,2,3,d=4,A=1,B=2) # a = 1 b = 2 c = 3 d = 4 kw = {'A': 1, 'B': 2} def function4(a, b, c=0, *arg, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'd =', d, 'kw =', kw) function4(1,2,3,4,5,d=6,A=1,B=2) # a = 1 b = 2 c = 3 arg= (4, 5) d = 6 kw = {'A': 1, 'B': 2}
到此这篇关于Python函数参数分类使用与新特性详细分析讲解的文章就介绍到这了,更多相关Python函数参数分类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!