python学习之函数
函数定义
函数:完成特定功能的一个语句组,通过调用函数名来完成语句组的功能,可以反馈结果,提供不 同的参数实现对不同数据的处理。
自定义函数由用户自己编写,系统自带函数有python中内嵌的函数和标准库函数
使用函数的目的:降低编程难度,代码重用。
函数定义语句:
- 函数关键字:函数以关键字def开头,后接函数名和圆括号()
- 函数名:必循遵循标识符的命名规则,最好有意义增加可读性
- 参数:必须放在圆括号中间,成为形式参数(形参),形参是可选的,可以有一个也可以有多个,多个参数间用‘,’分隔
- 函数说明:函数第一行的语句可以选择性地使用文档字符串,用于存放函数说明
- 函数内容:以冒号起始并且缩进
- 返回值:使用“return [表达式]”结束函数,返回一个值给调用方,若没有renturn返回值则默认返回None,当函数返回多个值时其本质是把这些值作为一个元组返回。
- 函数体:当函数体为pass语句,表示什么工作也不做,如抽象类中的抽象函数
|
例子:
|
函数有自己的成员,也可以为函数动态增减删除成员,在函数外部删除函数内部定义成员是无效的。
函数调用:
函数调用时需要指出函数名称,并传入相应的函数调用时传入的参数称实参,默认情况下传入的实参必须等于定义时形参个数,顺序一制
函数调用顺序:
- 执行函数调用前语句
- 执行函数调用,运行被调用函数内语句,并返回结果
- 执行函数调用后的语句
函数调用的两种方法:
- 调用函数传入实参
- 把函数对象赋给变量
定义一个求梯形面积函数并调用
|
函数参数传递
python中的对象分为不可变对象(数字、字符串、元组)和可变对象(列表、字典、集合)
- 实参为不可变对象,函数调用时将实参的值复制一份给形参,在函数调用中修改形参时不会影响函数外面的实参
- 实参为可变对象,函数调用时将实参引用复制给形参,在函数调用中修改形参时会影响函数外面的实参
实参为不可变对象调用:
|
实参为可变对象调用:
|
参数类型
必须参数
要求调用时传入的实参个数、顺序和函数定义时形参的个数、顺序完全一致
|
关键字参数
在函数调用时使用形参作为关键字来确定传入的参数值,允许函数调用时实参的顺序与函数定义时形参的顺序不一致
|
默认参数
调用函数时,如果没有传递实参,则会使用函数定义时赋予的参数的默认值
|
不定长参数
在实际使用中有可能需要一个函数能处理比当初声明时更多的参数,这种参数成为不定长参数
两种形式:
- *args:将接受的多个参数放在一个元组中
- **args:将显示赋值的多个参数放入字典中
|
参数传递的序列解包
参数传递的序列解包针对的是实参,有*或**两种形式,加了后会将列表、元组、字典等迭代对象中的元素分别传递给形参中的多个变量
将列表、元组、字典中的值分别迭代取出赋值给形参
特殊函数
1、匿名函数
匿名函数是指没有函数名的简单函数,只可以包含一个表达式,不允许包含其他复杂语句,表达式的结果就是函数的返回值
一般格式:
|
arg1,arg2,…:形参,可以没有,可以有一个或多个
expression:表达式
默认情况下调用匿名函数时传入实参个数与顺序同样要和匿名函数定义时形参个数顺序一致
map()会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
2、递归函数
如果一个函数在函数体中直接或间接的调用自身,那么这个函数就是递归函数,在执行的过程中可能会返回以再次调用该函数
函数a调用函数a自身为直接递归,函数a调用b,函数b在函数体中调用a则称简介递归
递归函数求前n项的和:
#递归求前n项的和
def fac(n):
if n==1:
return 1
else:
return fac(n-1)+n
if __name__ == '__main__':
print("前{}项的和为:{}".format(9,fac(9)))在递归时需要注意的两点:
1、递归函数就是在函数里调用自身
2、递归函数必须有一个明确的递归结束条件,称递归出口,否则造成死循环
3、前n-1项的和再加第n项,当n=1时为递归出口返回一使用递归求斐波那契数列前20项和
|
|
3、嵌套函数
嵌套函数是指在一个函数(外函数)中定义了另一个函数(内函数),称为内函数,嵌套函数中的内函数只能在外函数中调用,不能在外函数外面直接调用
|
4、装饰器
装饰器是python中的一个比较特殊的功能,是用来包装函数的函数,装饰器可以是程序代码更简洁
使用的情况:
- 将多个函数中的重复代码拿出来整理成一个装饰器,对每个函数使用装饰器,从而实现代码的重用
- 对多个函数的共同功能进行处理
定义装饰器的一般格式:
|
其中decorator为装饰器。@decorator为函数装饰器的修饰符。func为装饰器的函数对象参数,装饰器可以返回一个值、一个函数、一个装饰器或其他对象
如:
|
|
使用装饰器修改网页文本格式:
|
5、带参数的装饰器
装饰器除了默认函数对象参数还可以定义带参数的装饰器,带来更多的灵活性
|
若一个函数有多个装饰器装饰,则称为多重装饰器,多重装饰器的执行顺序是:先执行后面的装饰器,在执行前面的装饰器。
变量作用域
python中不同位置定义的变量决定了这个变量的访问权限和作用范围:
- 局部变量和局部作用域L(Local):包含在def关键字定义的语句块中即函数中定义的变量,局部变量在函数结束就消失了,调用时创建新的,结束时消失
- 全局变量和全局作用域G(Global):在模块的函数外定义的变量,在模块顶层声明的变量具有全局作用域,从外部看全局变量是模块对象的属性,全局作用域的作用仅限于单个模块文件内
- 闭包变量和闭包作用域E(Enclosing):定义在嵌套函数的外函数内、内函数外的变量,闭包变量作用域为嵌套函数内定义它的位置开始的整个函数内
- 内建变量和内建作用域B(Built-in):系统内固定模块里定义的变量一般预定义在内建模块内的变量
按照L→E→G→B的顺序查找,局部变量和全局变量使用的多,内建变量使用的最少
局部变量只能在其声明的函数内使用,全局变量在整个模块内访问
修改变量作用域的关键字:
- global:加上global即可将变量设置为全局变量
- nonlocal:加上即可将嵌套函数中的内函数局部变量变为闭包变量