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 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
python腾讯语音合成实现过程解析
Aug 01 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
Aug 05 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
Django实现网页分页功能
Oct 31 Python
python实现三壶谜题的示例详解
Nov 02 Python
Python中X[:,0]和X[:,1]的用法
May 10 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在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
PHP可变变量学习小结
2015/11/29 PHP
yii分页组件用法实例分析
2015/12/28 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
值得收藏的vuejs安装教程
2017/11/21 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
Vue面试题及Vue知识点整理
2018/10/07 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
python获取代码运行时间的实例代码
2018/06/11 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
竞选班长的演讲稿
2014/04/24 职场文书
商业项目策划方案
2014/06/05 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
涨价通知怎么写
2015/04/23 职场文书
2015年库房工作总结
2015/04/30 职场文书
病房管理制度范本
2015/08/06 职场文书
浅谈Python协程asyncio
2021/06/20 Python
Python读取和写入Excel数据
2022/04/20 Python