码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器和生成器

时间:2014-05-09 17:30:55      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   ext   

迭代器和和生成器都是容器对象。它们之间的关系是,生成器是一种特殊的迭代器。所以,先从迭代器入手。

迭代器:

 

python中,只要是实现了迭代协议的容器对象,都是迭代器。python的迭代器协议,基于两个方法:

 

·next() 返回下一个

 

·__iter__() 返回迭代器本身

 

 

 

如下就是一个迭代器:
bubuko.com,布布扣
python中的序列遍历完的时候抛出的StopIteration异常。而迭代器,迭代完成时也是抛出这个异常,这样迭代器和与循环式兼容的。都是捕捉到StopIteration异常来停止循环。
 
生成迭代器对象的两种方法:
1、使用iter()内置方法,使用该方法,可以将一个对象变为迭代器对象。
bubuko.com,布布扣
2、在类中定义迭代器的两个方法,满足迭代器协议。则,该类的对象就是迭代器对象。
bubuko.com,布布扣
 1 class MyIteration(object):
 2     """docstring for MyIteration"""
 3     def __init__(self, setp):
 4         self.step = step
 5 
 6     def next(self):
 7 
 8         if self.step == 0 :
 9             raise StopIteration
10         self.step -= 1
11         return self.step
12 
13     def __iter__(self):
14         return self
bubuko.com,布布扣

生成器:

生成器是一个特殊的迭代器,所以,也是有迭代器的特性。具有next()和__iter__()方法。不过,next()返回的是,yield指令放回的值。__iter__()方法,返回的是一个生产器对象。

bubuko.com,布布扣

 

生成器的使用不是很常见,虽然可以大大的简化了代码,但是对于我们这种从C,Java这样语言入门学习的人,这样的特性让我们感觉在思考上很别扭。程序猿不习惯这样的思路,但是这的确是一个很好的特性。将来要多多使用它来重构我的代码。

 

生成序列和循环执行的函数时,最好使用生成器。
bubuko.com,布布扣
bubuko.com,布布扣
生成器的一个有别于迭代器的重要特性,就是提供了代码的交互式。使用的时send()方法:
bubuko.com,布布扣
生成器还有一只简单的生成方式:
bubuko.com,布布扣

与列表推导式极其相似,只是[]被换成了()。

 

总结:

迭代器和生成器是python的两个很独特的容器对象。凸显了python的一个思想:“代码足够简单,而不是数据”。python提倡的简洁代码形式,生成器和迭代器都可以简单的几行代码,而操作一个负载的数据结构。

算法和数据的结构的实现,也应此变得简单。有空的话,我将用python来写写一些算法的实现。

迭代器和生成器,布布扣,bubuko.com

迭代器和生成器

标签:style   blog   class   code   java   ext   

原文地址:http://www.cnblogs.com/chengxuyuanxiaoye/p/3708628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!