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 相关文章推荐
python使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
跟老齐学Python之集合(set)
Sep 24 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
python中的字符串内部换行方法
Jul 19 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
python实现的生成word文档功能示例
Aug 23 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
OpenCV读取与写入图片的实现
Oct 13 Python
python反爬虫方法的优缺点分析
Nov 25 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函数 serialize()和unserialize()
2012/02/04 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
python生成日历实例解析
2014/08/21 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
django ajax json的实例代码
2018/05/29 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
基于python代码批量处理图片resize
2020/06/04 Python
python实现批量命名照片
2020/06/18 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
竞选班长演讲稿
2013/12/30 职场文书
少先队入队活动方案
2014/02/08 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
经营管理策划方案
2014/05/22 职场文书
另类冲刺标语
2014/06/24 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
2014年工程工作总结
2014/11/25 职场文书