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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
python函数装饰器用法实例详解
Jun 04 Python
python 基础教程之Map使用方法
Jan 17 Python
详解python 拆包可迭代数据如tuple, list
Dec 29 Python
一篇文章快速了解Python的GIL
Jan 12 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
pycharm修改file type方式
Nov 19 Python
python 基于UDP协议套接字通信的实现
Jan 22 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
15种PHP Encoder的比较
2007/04/17 PHP
php产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
python 实现线程之间的通信示例
2020/02/14 Python
python操作链表的示例代码
2020/09/27 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
幼儿运动会邀请函
2014/01/17 职场文书
岗位廉洁从业承诺书
2014/03/28 职场文书
团队精神的演讲稿
2014/05/14 职场文书
希特勒的演讲稿
2014/05/23 职场文书
质量管理标语
2014/06/12 职场文书
应届本科毕业生求职信
2014/07/23 职场文书
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫