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字典多条件排序方法实例
Jun 30 Python
使用Python的PEAK来适配协议的教程
Apr 14 Python
解析Python中的二进制位运算符
May 13 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
python实现梯度下降法
Mar 24 Python
Jupyter加载文件的实现方法
Apr 14 Python
Python可以实现栈的结构吗
May 27 Python
基于Python 的语音重采样函数解析
Jul 06 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
Jul 27 Python
如何通过python检查文件是否被占用
Dec 18 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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 for 循环语句使用方法详细说明
2010/05/09 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
解析csv数据导入mysql的方法
2013/07/01 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
《雷雨》教学反思
2014/02/20 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
求职信范文大全
2014/05/26 职场文书
技术股东合作协议书
2014/12/02 职场文书
2015年助残日活动总结
2015/03/27 职场文书
金陵十三钗观后感
2015/06/04 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
Redis数据结构之链表与字典的使用
2021/05/11 Redis
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python