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程序中使用Cookie的教程
Apr 30 Python
python查询sqlite数据表的方法
May 08 Python
python处理大数字的方法
May 27 Python
Python 编码处理-str与Unicode的区别
Sep 06 Python
python学习之hook钩子的原理和使用
Oct 25 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
Python中无限循环需要什么条件
May 27 Python
python中os包的用法
Jun 01 Python
Pycharm中如何关掉python console
Oct 27 Python
用Python实现屏幕截图详解
Jan 22 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/03/03 冲泡冲煮
yii2中添加验证码的实现方法
2016/01/09 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
Python 里最强的地图绘制神器
2021/03/01 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
竞聘书怎么写,如何写?
2014/03/31 职场文书
餐厅筹备计划书
2014/04/25 职场文书
护理专业求职信
2014/06/15 职场文书
2014年中秋寄语
2014/08/11 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
Go timer如何调度
2021/06/09 Golang