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中用函数作为返回值和实现闭包的教程
Apr 27 Python
构建Python包的五个简单准则简介
Jun 15 Python
python实现学生管理系统
Jan 11 Python
pandas 选择某几列的方法
Jul 03 Python
解决python "No module named pip" 的问题
Oct 13 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
django 环境变量配置过程详解
Aug 06 Python
python Pillow图像处理方法汇总
Oct 16 Python
简单了解python数组的基本操作
Nov 26 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
2014/08/11 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
phpquery中文手册
2021/03/18 PHP
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
玩手机检讨书1000字
2014/10/20 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
入党转正申请报告
2015/05/15 职场文书
让生命充满爱观后感
2015/06/08 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers