生成器, 迭代器, 装饰器,可迭代对象的应用场景
1. 可迭代对象
实现了迭代器协议的对象就是可迭代对象(实现方式是iter方法), 比如常用的字符串, 列表, 元组, 字典, 集合
2. 迭代器
迭代器对象就是实现了iter()和next()方法的对象, 其中iter()返回迭代器本身, 而next()返回容器的下一个元素, 在结尾处引发StopInteration异常
迭代器有两个方法: iter(), next()
- 所有的iterable都可以通过内置函数ier()转换为iterator
- 迭代器的优点: 省内存, 通过延时创建的方式生成一个序列, 只有在需要的时候才会被创建
- 迭代器对象从集合的第一个元素开始访问, 知道所有的元素被访问结束, 只能往前不能后退
- 迭代器有两个基本的方法: iter, next方法
- 内置函数iter(), next(), 本质上都是用的对象的iter()和next()方法
应用场景
- 迭代器是惰性计算的程序流,他没有数据,你需要下一个元素,它就按照算法给你计算出下一个元素返回,等到无法计算出下一个元素 时,将引发StopIteration异常,所以可迭代对象只能表示有限的元素个数,而迭代器甚至可以表示整个自然数集合。 --节省内存空间
- 循环用到的range(),其实就是一个迭代器,比如range(1000),不是生成一个1000个元素的集合,而是内置了next函数,逐个生成
- 文件调用的时候,file.readlines(),是返回了一个列表,而for line in file:则是迭代器中逐行前进,也是内置了next函数
3. 生成器
1. 一边循环一边计算的机制称作生成器
2. 生成器的好处: 对延迟操作提供支持, 指在需要的时候才产生结果, 而不是立即产生结果
3. 创建一个generator简单方法: 把一个列表生成师的[]改成(), 打印方法, generator的next()方法
1. python提供生成器的两种不同方式
1. 生成器表达式
类似于列表推导式,是用()代替了原来的[].生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
2. 生成器函数
和常规函数定义一样,但是返回语句return被yield语句代替了.yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行.
2. 生成器的特点
1. 语法上和普通函数相似, 用def定义, 普通函数用return返回, 生成器用yeild返回
2. 自动实现迭代器协议: 对于生成器, python会自动实现他的可迭代协议, 我们可以调用他的next方法, 获取下一个元素, 并且在没有值可以返回的时候, 生成器会自动产生
3. 状态挂起: 生成器使用yeild语句返回一值, yeild语句挂起该生成器函数的状态, 保留足够的信息, 以便从他离开的地方继续执行
3. 对于yield的总结
-
通常的for ... in ..循环中,后面的是一个列表或者是字典,或者是字符串.它的缺点是很明显的,就是在迭代的时候一下就分配了全部的内存,这样数据比较大,将会占用很大的内存.
-
生成器是可以迭代的,但是只可以读取它一次,因为用的时候才生成.生成器表达式和列表推导式的区别就是生成器表达式使用小括号而列表推导式使用[]
-
生成器(generator)能够迭代的关键是他有next()方法,工作原理是通过重复调用next()方法,直到捕获一个StopIteration异常
-
带有yield的函数不再是一个普通的函数,而是一个生成器函数.可以用于迭代
-
yield就是return返回的一个值,并且记住这个返回的位置.下一次迭代就从整个位置开始
-
send()和next()的区别就在于send可传递参数给yield表达式,这时候传递的参数就会作为yield表达式的值,而yield的参数是返回给调用者的值,也就是说send可以强行修改上一个yield表达式的值
4. 装饰器
装饰器时用来装饰函数的
1. 闭包
1. 函数的参数可以是函数 ---- 高阶函数
2. 函数的内部可以是定义函数 ---- 内部函数
3. 外部函数无法访问内部函数
4. 外部函数最终将内部函数返回
2. 应用场景
1. 日志处理
2. 公共校验(登录)
3. 附加功能
4. 函数执行时间统计
5. 缓存