Python的迭代器和生成器使用实例


Posted in Python onJanuary 14, 2015

一、迭代器Iterators

迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:

1)next方法
返回容器的下一个元素

2)__iter__方法
返回迭代器自身

迭代器可使用内建的iter方法创建,见例子:

>>> i = iter('abc')

>>> i.next()

'a'

>>> i.next()

'b'

>>> i.next()

'c'

>>> i.next()

Traceback (most recent call last):

  File "<string>", line 1, in <string>

StopIteration:
class MyIterator(object):

  def __init__(self, step):

  self.step = step

  def next(self):

  """Returns the next element."""

  if self.step==0:

  raise StopIteration

  self.step-=1

  return self.step

  def __iter__(self):

  """Returns the iterator itself."""

  return self

for el in MyIterator(4):

  print el

--------------------

结果:
3

2

1

0

二、生成器Generators

从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。
它基于yield指令,允许停止函数并立即返回结果。

此函数保存其执行上下文,如果需要,可立即继续执行。

例如Fibonacci函数:

def fibonacci():

  a,b=0,1

  while True:

  yield b

  a,b = b, a+b

fib=fibonacci()

print fib.next()

print fib.next()

print fib.next()

print [fib.next() for i in range(10)]

--------------------

结果:
1

1

2

[3, 5, 8, 13, 21, 34, 55, 89, 144, 233]

PEP Python Enhancement Proposal Python增强建议

tokenize模块

>>> import tokenize

>>> reader = open('c:/temp/py1.py').next

>>> tokens=tokenize.generate_tokens(reader)

>>> tokens.next()

(1, 'class', (1, 0), (1, 5), 'class MyIterator(object):/n')

>>> tokens.next()

(1, 'MyIterator', (1, 6), (1, 16), 'class MyIterator(object):/n')

>>> tokens.next()

(51, '(', (1, 16), (1, 17), 'class MyIterator(object):/n')

例子:
def power(values):

  for value in values:

  print 'powering %s' %value

  yield value

def adder(values):

  for value in values:

  print 'adding to %s' %value

  if value%2==0:

  yield value+3

  else:

  yield value+2

elements = [1,4,7,9,12,19]

res = adder(power(elements))

print res.next()

print res.next()

--------------------

结果:
powering 1

adding to 1

3

powering 4

adding to 4

7

保持代码简单,而不是数据。
注意:宁可有大量简单的可迭代函数,也不要一个复杂的一次只计算出一个值的函数。

例子:

def psychologist():

  print 'Please tell me your problems'

  while True:

  answer = (yield)

  if answer is not None:

  if answer.endswith('?'):

  print ("Don't ask yourself too much questions")

  elif 'good' in answer:

  print "A that's good, go on"

  elif 'bad' in answer:

  print "Don't be so negative"

free = psychologist()

print free.next()

print free.send('I feel bad')

print free.send("Why I shouldn't ?")

print free.send("ok then i should find what is good for me")

--------------------

结果:
Please tell me your problems

None

Don't be so negative

None

Don't ask yourself too much questions

None

A that's good, go on

None
Python 相关文章推荐
python操作mysql中文显示乱码的解决方法
Oct 11 Python
python实现用于测试网站访问速率的方法
May 26 Python
Python实现购物程序思路及代码
Jul 24 Python
python使用生成器实现可迭代对象
Mar 20 Python
python获取时间及时间格式转换问题实例代码详解
Dec 06 Python
python通过paramiko复制远程文件及文件目录到本地
Apr 30 Python
基于python3的socket聊天编程
Feb 17 Python
Python如何基于Tesseract实现识别文字功能
Jun 05 Python
python判断元素是否存在的实例方法
Sep 24 Python
python中实现栈的三种方法
Dec 19 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
python代码实现备忘录案例讲解
Jul 26 Python
python实现带验证码网站的自动登陆实现代码
Jan 12 #Python
Python三元运算实现方法
Jan 12 #Python
Python中的True,False条件判断实例分析
Jan 12 #Python
Python基类函数的重载与调用实例分析
Jan 12 #Python
Python类的专用方法实例分析
Jan 09 #Python
Python序列之list和tuple常用方法以及注意事项
Jan 09 #Python
Python中的生成器和yield详细介绍
Jan 09 #Python
You might like
Javascript常考语句107条收集
2010/03/09 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
JavaScript面向对象精要(下部)
2017/09/12 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
python 发送json数据操作实例分析
2019/10/15 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
新闻发布会主持词
2014/03/28 职场文书
工商管理自荐书
2014/07/06 职场文书
复兴之路观后感
2015/06/02 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏