函数
作用:结构话编程对代码的最基本的封装,一般按照功能组织一段代码,封装的目的是为了复用,减少冗余代码,代码更加简洁、美观,可读易懂;
分类:
内建函数,如max() reversed()等
库函数,如math.ceil()等
函数定义、调用
def语句定义函数
def 函数名(参数列表):
函数体(代码块)
[return 返回值]
函数名就是标识符,语句块必须缩进,约定4个空格;python的函数没有return语句,隐式返回一个None值;定义中的参数列表成为形式参数,只是一种符号表达,简称形参;
函数定义,只是声明了一个函数,它不会被执行,需要调用;调用的方式,就是函数名加上小括号,括号内写上参数,调用时写的参数是实际参数,是实实在在传入的值,简称实参;
举例:
上图所示只是一个函数的定义,又一个函数叫做add,接收2个参数,计算结果通过返回值返回,调用通过函数名add加两个餐素,返回值可使用变量接收;定义需要在调用前,也就是说调用时,已经被定义过了,否则抛NameError异常;函数是可调用的对象,callable();
函数的参数
参数调用时传入的参数要和定义的个数相匹配(可变参数例外);
位置参数
def f(x,y,z) 调用使用f(1,3,5) 按照参数定义顺序传入实参
关键字参数
def f(x,y,z) 调用使用f(x=1,y=3,z=5) 使用形参的名字来出入实参的方式,如果使用来形参名字,那么传参顺序就可和定义顺序不同;
传参
f(z=None,y=10,x=[1]) 关键字或者命名参数传参
f((1,),z=6,y=4.1) 位置和关键字参数使用传参;
f(y=5,z=6,2) #这个有问题,要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的;
函数参数默认值
参数默认值:定义时,在形参后跟上一个值
def add(x=4,y=5):
return x+y
测试调用add(6,10)、add(6,y=7)、add(x=5)、add()、add(y=7)、add(x=5,y=6)、add(y=5,x=6)
作用:
参数的默认值可以在未传入足够的实参的时候,对没有给定的参数赋值为默认值;
参数非常多的时候,并不需要用户每次都输入所有的参数、简化函数调用;
示例:
可变参数
一个形参可以匹配任意个参数
示例:有多个数,需要累加求和;
传入可迭代对象,迭代元素求和;
位置参数的可变参数
在形参前使用*表示该形参是可变参数,可以接收多个实参;
收集多个实参为一个tuple;
关键字参数的可变参数
示例:配置打印信息
如上图所示:形参前使用**符号,表示可以接收多个关键字参数;收集的实参名称和值组成一个字典;
可变参数混合使用
def showconfig(username,password,**kwargs)
def showconfig(username,*args,**kwargs)
def showconfig(username,password,**kwargs,*args)
总结:
有位置可变参数和关键字可变参数
位置可变参数在形参前使用一个*号;
关键字可变参数在形参前使用两个**号;
位置可变参数和关键字可变参数都可一收集若干个实参,位置可变参数收集成一个tuple,关键字可变参数收集成一个dict;
混合使用参数的时候,可变参数更要放到参数列表之后,普通参数需要放到参数列表前面,位置可变参数需要在关键字可变参数之前;
举例:
keyword-only参数
keyword-only参数是python3之后加入的,如果在一个*号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经不是普通的参数了,而是keyword-only参数;
示例:
如上图所示:args可以看作已经截获了所有的位置参数,x不使用关键字参数就不可能拿到实参;
keyword-only参数的另一种形式
如上图所示:*号之后,普通形参都变成了必须给出的deyword-only参数;属于特殊写法,*号没有任何意义;
可变参数和参数默认值
举例:
x是keyword-only参数
示例2: