16.函数进阶
6)函数的递归
函数调用自身的编程技巧称为递归,python递归的最大深度是1000。
(1)递归函数的特点
特点:一个函数内部调用自己,函数内部可以调用其他函数,当然在函数内部也可以调用自己
代码特点:
①函数内部的代码是相同的,只是针对参数不同,处理的结果不同
②当参数满足一个条件时,函数不再执行。这个非常重要,通常被称为递归的出口,否则会出现死循环!
(2)递归案例:计算数字累加
①需求:
(a)定义一个函数 sum_numbers
(b)能够接收一个 num 的整数参数
(c)计算 1 + 2 + ... num 的结果
②代码:
(3)递归案例:斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
(4)递归案例:二分法查找数据
二分法的思路:掐头结尾取中间。
优点:查找效率非常的高。
二分法的局限性:数据必须是有序的
需求:查询一个数据是否在列表(升序)中,如果在返回索引。
提示:递归是一个 编程技巧,初次接触递归会感觉有些吃力!在处理不确定的循环条件时,格外的有用,例如:遍历整个文件目录的结构、二叉树查询
7)闭包
如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
闭包的作用:
(1)保护变量
(2)让一个变量常驻内存
8)装饰器
装饰器的本质是大型的闭包
作用:在不改变原代码的基础上给代码增加新的功能
软件开发的开闭原则:
开放:可以对软件添加新的功能
封闭:不可以修改源代码
(1)装饰器的雏形:
游戏开挂:
(2)使用“语法糖@”简化代码
(3)带有参数的装饰器:
使用万能传参接收参数,可以兼容多种传参需求
(4)带返回值的装饰器:
(5)通用装饰器模型:
(6)装饰器练习:
需求:论坛功能有:看菜单、读贴、发帖、收藏,使用装饰器在发帖和收藏前添加登录判断,如果没有登录先登录
代码:
运行结果:
(7)带参数的装饰器:
运行结果:
①带参数的装饰器通用模型:
②练习:
(a)给func1和func2添加记录日志的功能
(b)要求func1的日志记录在func1.txt中,func2的日志记录在默认文件中
运行结果:
8)同一个函数被多个装饰器装饰
运行结果:
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳