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处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python 的 Socket 编程
Mar 24 Python
python 使用get_argument获取url query参数
Apr 28 Python
浅谈Python中的zip()与*zip()函数详解
Feb 24 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
Python单元测试实例详解
May 25 Python
python plotly画柱状图代码实例
Dec 13 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
python接入支付宝的实例操作
Jul 20 Python
python调用win32接口进行截图的示例
Nov 11 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
php数组一对一替换实现代码
2012/08/31 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
Javascript Object.extend
2010/05/18 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
JSON格式化输出
2014/11/10 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
Python操作列表之List.insert()方法的使用
2015/05/20 Python
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
Python实现学校管理系统
2018/01/11 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
python实现扫雷游戏
2020/03/03 Python
python绘制高斯曲线
2021/02/19 Python
大学学年自我鉴定
2013/10/28 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
管理信息系学生的自我评价
2014/01/11 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
个人买房协议书范本
2014/10/06 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript