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处理xml文件的方法小结
May 02 Python
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
Python语言的变量认识及操作方法
Feb 11 Python
python找出因数与质因数的方法
Jul 25 Python
查看Python依赖包及其版本号信息的方法
Aug 13 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
python程序文件扩展名知识点详解
Feb 27 Python
python 给图像添加透明度(alpha通道)
Apr 09 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
python 爬取B站原视频的实例代码
Sep 09 Python
python 实现ping测试延迟的两种方法
Dec 10 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
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php微信开发之百度天气预报
2016/11/18 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
百度留言本js 大家可以参考下
2009/10/13 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
对命令行模式与python交互模式介绍
2018/05/12 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
Python中url标签使用知识点总结
2020/01/16 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
质检员岗位职责
2013/12/17 职场文书
五年级科学教学反思
2014/02/05 职场文书
运动会稿件100字
2014/02/21 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python