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中optparse模块使用浅析
Jan 01 Python
django2 快速安装指南分享
Jan 05 Python
python中join()方法介绍
Oct 11 Python
解决python 无法加载downsample模型的问题
Oct 25 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
Python常见数字运算操作实例小结
Mar 22 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
python实现随机加减法生成器
Feb 24 Python
Python虚拟环境venv用法详解
May 25 Python
python实现移动木板小游戏
Oct 09 Python
python的scipy.stats模块中正态分布常用函数总结
Feb 19 Python
浅谈Python中对象是如何被调用的
Apr 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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
php empty函数判断mysql表单是否为空
2010/04/12 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
发布你的Python模块详解
2016/09/15 Python
python 中split 和 strip的实例详解
2017/07/12 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
团组织关系介绍信
2014/01/12 职场文书
年度考核评语
2014/01/19 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
宾馆安全管理制度
2015/08/06 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis