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
qpython3 读取安卓lastpass Cookies
Jun 19 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
Python 中Django安装和使用教程详解
Jul 03 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
python数据预处理 :数据抽样解析
Feb 24 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
Django REST Swagger实现指定api参数
Jul 07 Python
利用python 下载bilibili视频
Nov 13 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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
php allow_url_include的应用和解释
2010/04/22 PHP
php 发送带附件邮件示例
2014/01/23 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
在新窗口打开超链接的方法小结
2013/04/14 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
python开发入门——set的使用
2020/09/03 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
python安装sklearn模块的方法详解
2020/11/28 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
外包公司软件测试工程师
2014/11/01 面试题
计算机专业个人求职信范例
2013/09/23 职场文书
纠纷协议书
2014/04/16 职场文书
小学生植树节活动总结
2014/07/04 职场文书
会计试用期自我评价
2014/09/19 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python