python---高级特性(生成器、迭代器、闭包)
生成器
什么叫生成器?
在Python中,一边循环一边计算的机制,称为生成器:Generator。
什么时候需要使用生成器?
一般情况下我们不需要使用生成器,只有当我们因为性能限制才需要用到,比如我们使用python读取一
个10g的文件,如果一次性将10g的文件加载到内存处理的话(read方法),内存肯定会溢出;这里如果可以
使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.
如何创建生成器
第一种方法: 列表生成式的改写。 []改成()
第一种方法: yield关键字。
如何打印生成器的每一个元素呢?
通过for循环, 依次计算并生成每一个元素。
如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
生成器的特点是什么?
- 节约内存
- 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是
说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新
创建的。
生成器课上练习: 生成器的应用案例: 聊天机器人
生成器课上练习: 生成器的应用案例: 生产者-消费者模型
基于0库存的生产者消费者
生成器课上练习: 生成器的应用案例: 求平均值
迭代器
定义
迭代是访问容器元素的一种方式。迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
可迭代对象:可以直接作用于for循环的对象(如何判断是否可以迭代?)
一类是集合数据类型,如list, tuple,dict, set,str等;
一类是generator,包括生成器和带yield的generator function。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数
可迭代对象
调用next方法
字符串实现for循环
如何判断是不是可迭代对象
判断文件对象是否为可迭代对象
闭包
函数引用?
什么是闭包?
闭包的概念就是当我们在函数内定义一个函数时,这个内部函数使用了外部函数的临时 变量,且外部函数的返回值是内部函数的引用时,我们称之为闭包。
闭包再理解? 内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。
nonlocal关键字? 显式的指定变量不是闭包的局部变量
闭包的一个常用场景就是装饰器。
小例子
注意:函数line与变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,
这样,我们就确定了函数的最终形式(y=x+1和y=4x+5)。
优点: 闭包也具有提高代码可复用性的作用。