函数进阶5.1函数参数高级用法
一、缺省参数
1. 是什么
缺省参数也叫做默认参数,是指定义函数时形参变量有默认值,如果调用函数时没有传递参数,那么函数就用默认值,如果传递了参数就用传递的那个数据
示例
2. 做什么
当调用函数时,有些参数不必传递,而是用默认值,这样的场景往往都用缺省参数
例如,一个学校现在开始检查每个学生的信息,学生说:报告老师我是xxx学校xxx系xxx年级xxx班学生,名字叫xxxx,大家想只要是这学校的学生那么“xxx学校”就可以省略不用说了,因为大家都知道。所以就可以认为默认的学校就是xxx,而当其他学校的学生介绍时yyy学校名字案例说就一定要说清楚,否则让人弄混了
来个demo试试看
def print_info(name, class_name, grade, department_name, school_name="通俗易懂"): print("老师好:我是来自 %s学校 %s系 %s年级 %s班级 的学生,我叫%s" % ( school_name, department_name, grade, class_name, name )) print_info("dong", "超牛", "二", "软件工程") print_info("dong", "超牛", "二", "软件工程", "codetutor.top")
运行结果
老师好:我是来自 通俗易懂学校 软件工程系 二年级 超牛班级 的学生,我叫dong 老师好:我是来自 codetutor.top学校 软件工程系 二年级 超牛班级 的学生,我叫dong
3. 注意点
-
缺省参数只能在形参的最后(即最后侧)
-
缺省参数全挨在一起(在右侧),不是缺省参数挨在一起(在左侧)
>>> def printinfo(name, age=35, sex): ... print name ... File "<stdin>", line 1 SyntaxError: non-default argument follows default argument
二、命名参数
1. 是什么
命名参数是指:在调用函数时,传递的实参带有名字,这样的参数叫做命名参数
示例
2. 做什么
命名参数能够在调用函数的时候,不受位置的影响,可以给需要的参数指定传递数据
3. 注意点
-
命名参数的名字要与形参中的名字相同,不能出现命名参数名字叫做
num
,而形参中没有变量num
-
如果形参左侧有普通的形参,调用函数时传递的参数一定要先满足这些形参,然后再根据需要编写命名参数
def test(a, b, c=100, d=200): print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d)) # 下面的方式都成功 test(11, 22) test(11, 22, 33) test(11, 22, 33, 44) test(11, 22, d=33, c=44) # 下面的方式都失败 test(c=1, d=2) # 缺少a、b的值 test(c=1, d=2, 11, 22) # 11, 22应该在左侧
三、不定长参数
1. 是什么
不定长参数:定义函数的时候形参可以不确定到底多少个,这样的参数就叫做不定长参数
不定长参数有2种方式表示
*args
:表示调用函数时多余的未命名参数都会以元组的方式存储到args
中**kwargs
:表示调用函数时多余的命名参数都会以键值对的方式存储到kwargs
中
注意:
*
和**
是必须要写的,否则就变成了普通的形参了- 当我们说不定长参数的时候,就是指
*args
和**kwargs
示例
2. 做什么
通过不定长参数,能够实现调用函数时传递实参个数可以随意变换的需求
例如
def test(a, b, *args, **kwargs): print("-------------------------------") print(a, type(a)) print(b, type(b)) print(args, type(args)) print(kwargs, type(args)) test(11, 22) test(11, 22, 33, 44, 55, 66) test(11, 22, 33, 44, 55, 66, name="wanglaoshi", web_site="http://www.codetutor.top")
运行结果:
------------------------------- 11 <class 'int'> 22 <class 'int'> () <class 'tuple'> {} <class 'tuple'> ------------------------------- 11 <class 'int'> 22 <class 'int'> (33, 44, 55, 66) <class 'tuple'> {} <class 'tuple'> ------------------------------- 11 <class 'int'> 22 <class 'int'> (33, 44, 55, 66) <class 'tuple'> {'name': 'wanglaoshi', 'web_site': 'http://www.codetutor.top'} <class 'tuple'>
说明:
3. 注意点
- 加了星号
*
的变量args
会存放所有未命名的变量参数,args
为元组 - 而加
**
的变量kwargs
会存放命名参数,即形如key=value
的参数,kwargs
为字典 - 一般情况下
*args
、**kwargs
会在形参的最右侧 args
与kwargs
的名字可以变,例如叫*aa
,**bb
都是可以,但一般为了能够让其他的开发者快速读懂我们的代码最好还是不改
4. 特殊情况
缺省参数在*args
后面
def sum_nums_3(a, *args, b=22, c=33, **kwargs): print(a) print(b) print(c) print(args) print(kwargs) sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)
说明:
*args
后可以有缺省参数,想要给这些缺省参数在调用时传递参数,需要用命名参数传递,否则多余的未命名参数都会给args
- 如果有
**kwargs
的话,**kwargs
必须是最后的