1.迭代器
迭代器是python的强大的功能之一,是访问容器类型元素的一种方式
可迭代协议:有__iter__方法的变量/值都是可迭代对象
可迭代对象可以通过__iter__方法来返回一个迭代器
迭代器协议:有__iter__方法和__next__方法的变量/值都是迭代器
迭代器特有的方法:
- __length_hint__返回迭代器中的元素个数
- __setstate__ 控制迭代器开始从哪里开始迭代
- __next__ 从迭代器中取下一个值
有两种方法判断对象是不是一个迭代器:
'__iter__' in dir(iter) and '__next__' in dir(iter) 如果结果为True,则说明iter是一个迭代器,否则不是迭代器
注:dir() 返回一个由对象可用方法为元素组成的列表
从collections中导入Iterable,然后使用isinstance(args,Iterable)的返回值来判断是不是迭代器
迭代器的特点有:
- 具有__next__,__iter__方法
- 通过一个next就可以多次执行,获得所有这个容器中的值
- 迭代器中的值只能取一次
- 不取的时候值不出现
迭代器的优点:
- 节省内存:迭代器只有你取值时才生成数据,
- 惰性运算:迭代器只知道有多少个值,当前给出什么值,下一个将给出什么值,以及下一个值和当前值的关系,只有你取值时才会生成数据
range生成的就是一个迭代器
for循环的原理:
for循环的本质是将可迭代对象转换为迭代器,然后使用迭代器进行循环,for循环会帮你处理迭代器没有值产生的异常
for循环与迭代器的关系:
无论是迭代器还是可迭代对象都可以被for循环
如果直接循环迭代器,那么循环一次后就不能再取出值
如果循环非迭代器,每一次循环都相当于创建了一个迭代器,进行从头到尾的循环
迭代器的三种取值方式:
- for循环
- next方法
- 数据类型的强制转换
2.生成器
生成器的本质就是迭代器
生成器通过简单的函数来实现
只要函数中含有yield关键字,这个函数就是一个生成器函数.
生成器函数调用时不会执行,返回一个生成器,只有生成器执行__next__方法是才会执行,执行到yield,返回yield后的值
yield的作用就是记录当前函数执行到的位置,下一次调用__next__方法是继续执行
yield from list 作用等同于:for temp in list:yield temp
生成器表达式
生成器表达式与列表推导式格式类似,格式为(x for x in range(5)),生成器表达式本身就是一个生成器
g.send()相当于g.__next__(),但是g.send()会传一个值过去,具体用法如下:
def func():
a = yield 1
yield a
g = func()
g.__next__()
g.send(2)
g.send(2)的返回值为2
__next__方法相当于send的值为None