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算法之栈(stack)的实现
Aug 18 Python
Python  pip安装lxml出错的问题解决办法
Feb 10 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
python将list转为matrix的方法
Dec 12 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
python实现爬取百度图片的方法示例
Jul 06 Python
Django实现分页显示效果
Oct 31 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 Python
Python学习之路安装pycharm的教程详解
Jun 17 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
2021年最新CPU天梯图
2021/03/04 数码科技
聊天室php&amp;mysql(四)
2006/10/09 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
用python代码做configure文件
2014/07/20 Python
python3 爬取图片的实例代码
2018/11/06 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
Python wordcloud库安装方法总结
2020/12/31 Python
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
生产部岗位职责范文
2014/02/07 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
小学生环保标语
2014/06/13 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
七一活动主持词
2015/06/29 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫