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 相关文章推荐
详解Django框架中用户的登录和退出的实现
Jul 23 Python
Sanic框架路由用法实例分析
Jul 16 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
python中class的定义及使用教程
Sep 18 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Django 自动生成api接口文档教程
Nov 19 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
python小白学习包管理器pip安装
Jun 09 Python
python和anaconda的区别
May 06 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 开源AJAX框架14种
2009/08/24 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
jQuery滚动加载图片实现原理
2015/12/14 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
Python获取apk文件URL地址实例
2013/11/01 Python
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
在Python下尝试多线程编程
2015/04/28 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
Python之修改图片像素值的方法
2019/07/03 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
经济贸易专业自荐信
2014/06/11 职场文书
应聘教师求职信
2014/07/19 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
MySQL一些常用高级SQL语句
2021/07/03 MySQL