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语言中的按位运算符
Nov 26 Python
Python写的创建文件夹自定义函数mkdir()
Aug 25 Python
详解Python使用simplejson模块解析JSON的方法
Mar 24 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
python+selenium识别验证码并登录的示例代码
Dec 21 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
Dec 19 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
在ipython notebook中使用argparse方式
Apr 20 Python
python爬虫可以爬什么
Jun 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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
PHP反射机制用法实例
2014/08/28 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
vue路由中前进后退的一些事儿
2019/05/18 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
编程语言Python的发展史
2014/09/26 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
新闻专业个人自我评价
2013/09/21 职场文书
门卫工作岗位职责
2013/12/17 职场文书
师德个人剖析材料
2014/02/02 职场文书
士力架广告词
2014/03/20 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
商家认证委托书格式
2014/10/16 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
python元组打包和解包过程详解
2021/08/02 Python