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中的anydbm模版和shelve模版使用指南
Jul 09 Python
Python版名片管理系统
Nov 30 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
django中瀑布流写法实例代码
Oct 14 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
Python 静态方法和类方法实例分析
Nov 21 Python
Python代码块及缓存机制原理详解
Dec 13 Python
详解Python中string模块除去Str还剩下什么
Nov 30 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 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
?生?D片??C字串
2006/12/06 PHP
PHP 采集心得技巧
2009/05/15 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
js 设置选中行的样式的实现代码
2010/05/24 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
Python守护线程用法实例
2017/06/23 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
青春雷锋观后感
2015/06/10 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
2016年清明节寄语
2015/12/04 职场文书