迭代器与生成器

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)的返回值来判断是不是迭代器

迭代器的特点有:

  1. 具有__next__,__iter__方法
  2. 通过一个next就可以多次执行,获得所有这个容器中的值
  3. 迭代器中的值只能取一次
  4. 不取的时候值不出现

迭代器的优点:

  • 节省内存:迭代器只有你取值时才生成数据,
  • 惰性运算:迭代器只知道有多少个值,当前给出什么值,下一个将给出什么值,以及下一个值和当前值的关系,只有你取值时才会生成数据

range生成的就是一个迭代器

for循环的原理:

for循环的本质是将可迭代对象转换为迭代器,然后使用迭代器进行循环,for循环会帮你处理迭代器没有值产生的异常

for循环与迭代器的关系:

无论是迭代器还是可迭代对象都可以被for循环

如果直接循环迭代器,那么循环一次后就不能再取出值

如果循环非迭代器,每一次循环都相当于创建了一个迭代器,进行从头到尾的循环

迭代器的三种取值方式:

  1. for循环
  2. next方法
  3. 数据类型的强制转换

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

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值