迭代器
迭代器定义
1.迭代器是访问集合内元素的一种方式,迭代器对象从集合的第一个元素对象开始访问,知道所有元素都被访问结束。
2.迭代器只能往前,前不能后退
迭代器作用
迭代器是用来帮助我们记录每次迭代访问的位置,当我们使用next()函数的时候,迭代器会向我们返回她所记录位置的下一个位置的元素
next()和iter()
next()函数调用的就是迭代器对象的__next__方法
iter()函数调用的就是可迭代对象的__iter__方法
(iter()函数在往细说就是 iter()函数调用了可迭代对象提供的迭代器里的__iter__方法)
iter为什么要返回自身
python要求迭代器本身也是可迭代对象,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可
迭代器本质
一个拥有__iter__方法和__next__() 的对象就是一个迭代器
判断是否是迭代器
先使用iter()函数把可迭代对象转化为迭代器
from collections import Iterator
isinstance(iter([]),Iterator)
可迭代对象
一个具备了__iter__方法的对象就是一个可迭代对象
可迭代对象通过__iter__方法向我们提供一个迭代器
判断是否是可迭代对象
from collections import Iterable
isinstance([1,3],Iterable)
迭代器的应用场景
简洁版(不用再将所有要迭代的数据都一次性缓存下来供后续一次读取,而是迭代到某个元素是才会把该元素放入内存中,在此之前后之后可以不存在或被销毁,这样更节省内存)
我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。
生成器
生成器工作原理
1.生成器它会记住上一次返回时在函数中的位置
2.对生成器函数的第二次(或第n次)调用跳转至该函数中间,而上一次调用的所有局部变量都保持不变
3.迭代到下一次调用时,所使用的参数都是第一次所保留下来的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
yield 生成器运行机制
- 当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把yield 的参数给你,之后生成器就不会往下继续运行。
- 当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复
装饰器
装饰器的定义
1.装饰器是由闭包支持的
2.装饰器本质上是⼀个python函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能
import time
def task(func):
def iner():
start = time.time()
func()
print( '时间是', (time.time() - start))
return iner
@task
def task2():
print('我用了多长时间')
time.sleep(5)
task2()