目录
1. 闭包
我们可以在⼀个函数中再定义⼀个函数,在函数内部定义的函数称之为内部函数,内部函数只能在函数内使⽤,不会污染外部空间。定义内部函数的函数称之为外部函数,这样的定义构成函数的嵌套
- 内部函数只能在外部函数⾥调⽤,外界⽆法直接调⽤内部函数
在⼀个外部函数中定义了⼀个内部函数,内部函数⾥引⽤了外部函数的变量,并且外部函数的返回值是内函数的引⽤。这样内部函数和其执⾏所需的环境变量就构成了⼀个闭包。
⼀般情况下,如果⼀个函数结束,函数的内部所有东⻄都会释放掉,局部变量都会消失。但是闭包是⼀种特殊情况,如果外函数在结束的时候发现有⾃⼰的局部变量将来会在内部函数中⽤到,就把这个局部变量绑定给了内部函数,然后⾃⼰再结束。
在闭包中⽆法直接修改外部变量x的值
在python3中可以通过nonlocal关键字声明⼀下x,表示这个变量不是局部变量,需要向上⼀层变量空间找这个变量。
2 装饰器(重点,难点)
软件开发中有⼀条⾮常重要的规则就是:对修改封闭,对扩展开放。 对于⼀个现有的函数,如果想要增强此函数的功能,但是不允许修改此函数源代码的时候,使⽤装饰器来解决这个问题
- 本质:就是⼀个闭包,还是⼀个返回函数的⾼阶函数
- 好处:就是在不⽤修改原函数代码的前提下给函数增加新的功能
2.1 装饰器写法
2.2使⽤@语法糖将装饰器应⽤到指定函数上,简化使⽤
2.3 带有不定⻓参数的装饰器
同⼀个装饰器可以应⽤于多个函数
2.4 多个装饰器作⽤在⼀个函数上(不重要)
3.递归函数(不是重点)
3.1 嵌套调⽤
在函数A中可以调⽤函数B,在函数B中可以调⽤函数C,这种调⽤⽅式称为函数的嵌套调⽤。
3.2 递归调⽤
⼀个函数直接或间接的调⽤⾃⼰则称为递归调⽤。
3.3 递归调⽤过程
递归调⽤可分解为两个过程,正向递归调⽤和逆向递归返回。
3.4 递归适⽤条件
如果⼀个问题规模缩减后,求解⽅式和原来⼀样,⼩规模问题解决后导致问题的最终解决,则可适⽤递归
- 形式是递归的 阶乘和斐波那契数列
- 结构是递归的 列表遍历
- 解法是递归的 汉诺塔
递归的写法:
- ⼀个递归程序必须包含两部分:
1) 递归终⽌条件
2) 递归调⽤⾃⼰
作业
1.有五个学⽣坐在⼀起,问第五个⼈多少岁?答⽐第四个⼤2岁,第四个⼈说它⽐第三个⼈⼤2岁, ,...第⼀个⼈说他10岁。请写⼀个递归函数计算第5个学⽣多少岁(递归实现)
2.某班期末考试科⽬为数学和计算机,有最多不超过30⼈参加考试。学⽣的信息包括学号、姓名。考试后要求:
(1)计算每个学⽣的总分和平均分;
(2)按总分成绩由⾼到低排出成绩的名次;
(3)打印出名次表,表格内包括学⽣姓名、学号、各科分数、总分和平均分;
(4)任意输⼊⼀个学号,能够查找出该学⽣在班级中的排名及其考试分数
编写要求:
(1) 要对⽤户输⼊进⾏验证,如果输⼊的不是0-4显示错误,然后继续输⼊
(2) 要能够连续不断的进⾏选择
(3) 每⼀项功能都要封装函数完成,函数单独放到⼀个模块中
(4) 菜单及其⽤户选择的处理放到主模块中。
(5) 学⽣数据保存到⽂件