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 str与repr的区别
Mar 23 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
解决yum对python依赖版本问题
Jul 05 Python
Python实现自定义读写分离代码实例
Nov 16 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
python urllib和urllib3知识点总结
Feb 08 Python
使用python如何删除同一文件夹下相似的图片
May 07 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函数(ignore_user_abort)
2012/08/01 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php之curl设置超时实例
2014/11/03 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
jQuery语法总结和注意事项小结
2012/11/11 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python深入学习之特殊方法与多范式
2014/08/31 Python
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python实现八大排序算法
2016/08/13 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
pytorch标签转onehot形式实例
2020/01/02 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
对python中各个response的使用说明
2020/03/28 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
学生就业推荐信
2013/11/13 职场文书
大学自我鉴定
2013/12/20 职场文书
经济管理专业自荐信
2013/12/30 职场文书
探亲假请假条
2014/04/11 职场文书
Python极值整数的边界探讨分析
2021/09/15 Python
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js