Python生成器的使用方法和示例代码


Posted in Python onMarch 04, 2019

本文是《Effect Python 编写高质量Python代码的59个有效方法》的学习笔记。主要记录生成器的使用方法和示例代码。

返回队列的函数

如果函数要产生一系列结果,那么最简单的做法就是把这些结构都放在一份列表里,然后将其返回给调用者。

def index_words(text):
  """用append方法将这些此的首字母索引添加到result列表中,并在函数结束时将其返回给调用者。"""
  result = []
  if text:
    result.append(0)
  for index, letter in enumerate(text):
    if letter == ' ':
      result.append(index+1)
  return result

输入一些测试值,验证该函数能正常运行:

>address = 'Four score and seven years ago...'
result = index_words(address)
print(result[:3])

打印

[0, 5, 11]

生成器函数

这个函数改用生成器(generator)来写会更好。生成器是使用yield表达式的函数。调用生成器函数时,它并不会真的运行,而是会返回迭代器。每次在这个迭代器上面调用内置的next函数时,迭代器会把生成器推进到下一个yield表达式那里。生成器传给yield的每一个值,都会由迭代器返回给调用者。

def index_words_iter(text):
  if text:
    yield 0
  for index, letter in enumerate(text):
    if letter == ' ':
      yield index + 1
result = list(index_words_iter(address))

注意:生成器函数返回的迭代器是有状态的,调用者不应该反复使用。

由于迭代器只能产生一轮结果。在抛出过StopIteration异常的迭代器或生成器上面继续迭代第二轮,是不会有结果的。为解决此问题,我们可以明确地使用该迭代器制作一份列表,将它的全部内容都遍历一次,并赋值到这份列表里,然后就可以在复制出来的数据列表上面多次迭代了。

为类实现生成器

下面是一个可以迭代的容器类,用来从文件中读取每行数据。

class ReadFileLines(object):
  """
  可以迭代的容器类,从文件中获取数据
  """
  def __init__(self, path):
    self.path = path
  def __iter__(self):
    with open(self.path) as f:
      for line in f:
        yield line

多次迭代

如果想多次迭代生成器的数据,可以使用下面的函数。该函数会逐步拷贝生成器的所有数据,然后返回一个队列数据。

def normalize_defensive(datas):
  """
  从生成器返回一份可以多次迭代的数据
  :param datas:容器 
  :return: result:队列(list)
  """
  # 确保调用者传进来的参数,并不是迭代器对象本身
  if iter(datas) is iter(datas):
    raise TypeError('Must supply a container')
  # TODO
  result = []
  for data in datas:
    # TODO
    result.append(data)
  return result

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
简单的Python的curses库使用教程
Apr 11 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
Python 爬虫图片简单实现
Jun 01 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
Python中整数的缓存机制讲解
Feb 16 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
Python绘制频率分布直方图的示例
Jul 08 Python
Python测试Kafka集群(pykafka)实例
Dec 23 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
Python去除字符串前后空格的几种方法
Mar 04 #Python
python调用外部程序的实操步骤
Mar 04 #Python
Python实现的合并两个有序数组算法示例
Mar 04 #Python
python创造虚拟环境方法总结
Mar 04 #Python
Python3爬楼梯算法示例
Mar 04 #Python
Python3最长回文子串算法示例
Mar 04 #Python
Python地图绘制实操详解
Mar 04 #Python
You might like
php 删除数组元素
2009/01/16 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
Sea.JS知识总结
2016/05/05 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python数据类型详解(二)列表
2016/05/08 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
Python模块的制作方法实例分析
2019/12/21 Python
python logging通过json文件配置的步骤
2020/04/27 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
初婚未育证明样本
2015/06/18 职场文书
倡议书怎么写?
2019/04/11 职场文书