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 ljust rjust center输出
Sep 06 Python
python控制台显示时钟的示例
Feb 24 Python
Python运算符重载详解及实例代码
Mar 07 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
详解Python IO口多路复用
Jun 17 Python
如何正确理解python装饰器
Jun 15 Python
Python anaconda安装库命令详解
Oct 16 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自动适应范围的分页代码
2008/08/05 PHP
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
jquery操作select option 的代码小结
2011/06/21 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
解决PyCharm import torch包失败的问题
2018/10/13 Python
python字典排序的方法
2019/10/12 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
技术经理的自我评价范文
2013/12/03 职场文书
消防安全责任书
2014/04/14 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
亮剑观后感
2015/06/05 职场文书
淮海战役观后感
2015/06/11 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server