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 相关文章推荐
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
python 中xpath爬虫实例详解
Aug 26 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
用python对excel查重
Dec 07 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
Python 文件和输入输出小结
2013/10/09 Python
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Python中endswith()函数的基本使用
2015/04/07 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
总监职责范文
2013/11/09 职场文书
《三峡》教学反思
2014/03/01 职场文书
公司寄语大全
2014/04/10 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android