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插件virtualenv搭建虚拟环境
Nov 20 Python
python实现windows下文件备份脚本
May 27 Python
Python3实现转换Image图片格式
Jun 21 Python
flask中过滤器的使用详解
Aug 01 Python
python中的tcp示例详解
Dec 09 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Python使用pyserial进行串口通信的实例
Jul 02 Python
解决Django中多条件查询的问题
Jul 18 Python
django页面跳转问题及注意事项
Jul 18 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
python 命名规范知识点汇总
Feb 14 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 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
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
jquery、js操作checkbox全选反选
2014/03/12 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
python最长回文串算法
2018/06/04 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
学校教学管理制度
2015/08/06 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js