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二叉树遍历的实现方法
Nov 21 Python
python读取csv文件示例(python操作csv)
Mar 11 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python松散正则表达式用法分析
Apr 29 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
Django 数据库同步操作技巧详解
Jul 19 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
Python实现生成密码字典的方法示例
Sep 02 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 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删除数组中的特定元素的代码
2012/06/28 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
javascript的BOM
2016/05/03 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
vuex 的简单使用
2018/03/22 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
python中zip和unzip数据的方法
2015/05/27 Python
python与C互相调用的方法详解
2017/07/14 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
Pytorch转tflite方式
2020/05/25 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
两则小学生的自我评价分享
2013/11/14 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
人事文员岗位职责
2015/02/04 职场文书
幼儿园开学通知
2015/04/24 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书