本文是《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生成器的使用方法和示例代码相关推荐

  1. python代码大全和用法用量_python零基础入门命令方式汇总大全,快速恶补你的Python基础...

    原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...

  2. python代码大全和用法用量_Python numpy.stack()用法及代码示例

    numpy.stack()函数用于沿新轴连接相同尺寸数组的序列.axis参数指定结果轴尺寸中新轴的索引.例如,如果axis = 0,它将是第一个尺寸:如果axis = -1,它将是最后的尺寸. 用法: ...

  3. python怎样实现界面的切换_python tkinter实现界面切换的示例代码

    跳转实现思路 主程序相当于桌子: import tkinter as tk root = tk.Tk() 而不同的Frame相当于不同的桌布: face1 = tk.Frame(root) face2 ...

  4. python爬虫公众号音频源代码_python爬取音频下载的示例代码

    抓取"xmly"鬼故事音频 import json # 在这个url,音频链接为JSON动态生成,所以用到了json模块 import requests headers = { & ...

  5. python实时播放音频和录音_python实现播放音频和录音功能示例代码

    python实现播放音频和录音功能示例代码 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  python实现播放音频和录音功能示例代码.txt ] (友情提示:右 ...

  6. set.difference() 的用法(python3)_Python 集合 difference_update() 使用方法及示例

    Python 集合 difference_update() 使用方法及示例 Difference_update()使用集合的差集更新集合,并调用difference_update()方法. 如果A和B ...

  7. python代码大全心形盒子简单_Python: 有趣的心形打印代码

    python 3+, 命令行和文件都可以 importtimeimportosimportmath out= [([(time.sleep(a), print(""+i,end=& ...

  8. Python pandas 保存Excel自动调整列宽的方法及示例代码

    本文主要介绍Python中,使用pandas.ExcelWriter保存Excel文件数据时,自动判断调整列的宽度方法,以及相关的示例代码. 原文地址:Python pandas 保存Excel自动调 ...

  9. python学习-日志(logging的定义、参数、format、示例代码、创建logging对象、设置Handler)

    文章目录 logging介绍 logging.basicConfig定义 logging.basicConfig参数说明 logging.basicConfig日志等级说明 logging.basic ...

最新文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案-第七小题
  2. UPDATE ORACLE(9i OR 10G) USER'S PASSWORD AND GET ORACLE VERSION MESSAGE
  3. SVN 常用操作命令 使用笔记
  4. 图像分类简单介绍-转
  5. C++:cin.getline
  6. 2019 牛客多校第一场 E ABBA
  7. oracle是否启用dataguard,启动和关闭data guard的步骤
  8. java 判断文件是否打开过_【后端开发】Java中如何判断文件是否被隐藏?(代码示例)...
  9. 没有找到 AUTOBACKUP
  10. 开源视频平台:Kaltura
  11. python字母表顺序函数_python获取字母在字母表对应位置的几种方法及性能对比较...
  12. 《薛兆丰的经济学课》课程总结4--相互依赖
  13. 经常用电脑辐射大怎么办?这5个习惯可以防辐射
  14. 从程序员到项目经理(21):谁都需要成就感
  15. 阿里巴巴大规模神龙裸金属 Kubernetes 集群运维实践
  16. python 画隐函数图像 画三维显函数图像
  17. pandas笔记1 --pandas处理mat表格文件
  18. uniapp组件-uni-icons 图标
  19. 波形发生器设计(频率、占空比、幅值可调)
  20. 计算机无法识别苹果6手机软件,电脑里安装的itunes不能识别我的苹果6sp… - Apple 社区...

热门文章

  1. 为什么重写equals时必须重写hashCode方法?
  2. 指静脉屏幕说明usart hmi
  3. CAShapeLayer的使用[1]
  4. 做一个程序员,是不是“努力就会成功”?现实残酷但又必须面对!
  5. 什么样的程序员会让人讨厌?大家注意,千万不要成为这种程序员!
  6. 7PYX 网站代码下载
  7. 此时我的waga2012源码情绪也平静了许多
  8. 夫学须静也freeeim
  9. C++喜欢收录和反链都保持增长的态势
  10. 软件史上最伟大的十大程序员