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中处理字符串之isdecimal()方法的使用
May 20 Python
Python找出list中最常出现元素的方法
Jun 14 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
python负载均衡的简单实现方法
Feb 04 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
django model通过字典更新数据实例
Apr 01 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
Python面向对象实现方法总结
Aug 12 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
Python进程间的通信之语法学习
Apr 11 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
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
js实现微博发布小功能
2017/01/12 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
在Django的session中使用User对象的方法
2015/07/23 Python
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
使用Python对Excel进行读写操作
2017/03/30 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
django使用JWT保存用户登录信息
2020/04/22 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
敬老院院长事迹材料
2014/05/21 职场文书
个人安全生产承诺书
2014/05/22 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
2015年读书月活动总结
2015/03/26 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers