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之print详解
Sep 28 Python
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 Python
在Python中使用AOP实现Redis缓存示例
Jul 11 Python
python3实现随机数
Jun 25 Python
python的内存管理和垃圾回收机制详解
May 18 Python
详解Python中的format格式化函数的使用方法
Nov 20 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
Python装饰器结合递归原理解析
Jul 02 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 Python
python基础详解之if循环语句
Apr 24 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP简单日历实现方法
2016/07/20 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
PHP7修改的函数
2021/03/09 PHP
JS的Document属性和方法小结
2013/09/17 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
Python的一些用法分享
2012/10/07 Python
使用python实现baidu hi自动登录的代码
2013/02/10 Python
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
pytorch forward两个参数实例
2020/01/17 Python
python 19个值得学习的编程技巧
2020/08/15 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
我爱我家教学反思
2014/05/01 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
五一口号
2014/06/19 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
党员对照检查材料
2014/09/22 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
工程进度款催款函
2015/06/24 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python