迭代器和生成器

迭代器:迭代器就是实现了迭代器协议的对象。所谓的迭代器协议就是如果一个对象包括一个叫”next”(python3 为__next__)的方法,那么这个对象就叫做“迭代器”。

迭代器协议一般实现_iter__()和__next__()两个方法。

_iter__():即返回迭代器本身

__next__():返回迭代器容器中的下一个元素,在结尾时引发一个StopIteration异常终止迭代器。

例:

1.1  

l2=[1,2,3,4,5]

 l2.__iter__()

<list_iterator object at 0x00000221D8607128>

所以,l2是个可迭代对象。下面调用__next__(),判定是否为迭代器对象

l2.__next__()

输出:

 'list' object has no attribute '__next__'

所以由定义可知,l2并不能够调用__next__(),所以它并不是迭代器对象。看下l2的格式就知道了

type(l2)

<class 'list'>----表明l2是个list对象,并不是迭代器。

1.2    

l2=[1,2,3,4,5]
l3=l2.__iter__()
l3.__next__()

输出结果:由定义知:l3可调用__next__(),所以l3为迭代器对象。

看下l3格式就明白了,

type(l3)

输出:

<class 'list_iterator'>  为迭代器

生成器:生成器先是一个迭代器,然后其内容是按需生成。包含yield的函数。换句话说,一边循环一边计算(惰性计算)的迭代器称为生成器(Generator)

生成器只不过是在函数中return被yield取代,当调用函数时,其会返回一个迭代器,并不是立即执行内容,直至调用next方法开始执行,执行到yield标志着此次迭代结束。注意一点的是,生成器智能迭代一次,而迭代器则是多次迭代,这也是两者之间的区别。

def fun2():
    print("中国")
    yield"万岁"
    print("!")
a=fun2()
print(a)

输出:

<generator object fun2 at 0x00000221D86017D8>

输出的是生成器,并没有执行

-->print(a.__next__())

输出:

中国
万岁

执行遇到yield语句,则表示此次迭代结束。

-->print(a.__next__())

输出:

!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值