参考链接: Python中的生成器Generator

Python的生成器

什么是生成器

创建python迭代器的过程虽然强大,但是很多时候使用不方便。生成器是一个简单的方式来完成迭代。简单来说,Python的生成器是一个返回可以迭代对象的函数。

怎样创建生成器

在一个一般函数中使用yield关键字,可以实现一个最简单的生成器,此时这个函数变成一个生成器函数。yield与return返回相同的值,区别在于return返回后,函数状态终止,而yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行。

生成器函数与一般函数的不同

一下是几点不同:

生成器函数包含一个或者多个yield当调用生成器函数时,函数将返回一个对象,但是不会立刻向下执行像__iter__()和__next__()方法等是自动实现的,所以我们可以通过next()方法对对象进行迭代一旦函数被yield,函数会暂停,控制权返回调用者局部变量和它们的状态会被保存,直到下一次调用函数终止的时候,StopIteraion会被自动抛出  举例:

# 简单的生成器函数

def my_gen():

n=1

print("first")

# yield区域

yield n

n+=1

print("second")

yield n

n+=1

print("third")

yield n

a=my_gen()

print("next method:")

# 每次调用a的时候,函数都从之前保存的状态执行

print(next(a))

print(next(a))

print(next(a))

print("for loop:")

# 与调用next等价的

b=my_gen()

for elem in my_gen():

print(elem)

使用循环的生成器

# 逆序yield出对象的元素

def rev_str(my_str):

length=len(my_str)

for i in range(length-1,-1,-1):

yield my_str[i]

for char in rev_str("hello"):

print(char)

生成器的表达式

Python中,有一个列表生成方法,比如

# 产生1,2,3,4,5的一个列表

[x for x in range(5)]

如果换成[]换成(),那么会成为生成器的表达式。

(x for x in range(5))

具体使用方式:

a=(x for x in range(10))

b=[x for x in range(10)]

# 这是错误的,因为生成器不能直接给出长度

# print("length a:",len(a))

# 输出列表的长度

print("length b:",len(b))

b=iter(b)

# 二者输出等价,不过b是在运行时开辟内存,而a是直接开辟内存

print(next(a))

print(next(b))

为什么使用生成器

更容易使用,代码量较小内存使用更加高效。比如列表是在建立的时候就分配所有的内存空间,而生成器仅仅是需要的时候才使用,更像一个记录代表了一个无限的流。如果我们要读取并使用的内容远远超过内存,但是需要对所有的流中的内容进行处理,那么生成器是一个很好的选择,比如可以让生成器返回当前的处理状态,由于它可以保存状态,那么下一次直接处理即可。流水线生成器。假设我们有一个快餐记录,这个记录的地4行记录了过去五年每小时售出的食品数量,并且我们要把所有的数量加在一起,求解过去5年的售出的总数。假设所有的数据都是字符串,并且不可用的数字被标记成N/A。那么可以使用下面的方式处理:

with open('sells.log') as file:

pizza_col = (line[3] for line in file)

per_hour = (int(x) for x in pizza_col if x != 'N/A')  # 使用生成器进行自动迭代

print("Total pizzas sold = ",sum(per_hour))

[转载] Python的生成器相关推荐

  1. [转载] Python中生成器和迭代器的区别

    参考链接: Python迭代器 Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list.string.tuple.dict等这些容器对 ...

  2. python使用生成器生成浮点数列表、使用生成器生成(正)负的浮点数列表

    python使用生成器生成浮点数列表.使用生成器生成(正)负的浮点数列表 目录 pyth

  3. python的生成器

    python的生成器 可以把生成器理解成是特殊的迭代器. 生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却 ...

  4. python 迭代器 生成器_Python迭代器和生成器

    迭代器认知 迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器. __iter__()的作用是可以让for循环遍历.而 ...

  5. 化学人学python有前途吗-转载:python之蟒开启理论计算化学的新时代

    转载:python之蟒开启理论计算化学的新时代 (2014-01-23 23:04:00) 标签: python gaussian python之蟒开启理论计算化学的新时代 就像iphone和andr ...

  6. python将汉字转为拼音字母_科学网—[转载]python中文汉字转拼音 - 陈明杰的博文...

    将汉字转为拼音.可以用于汉字注音.排序.检索(Russian translation) . 特性根据词组智能匹配最正确的拼音. 支持多音字. 简单的繁体支持, 注音支持. 支持多种不同拼音/注音风格. ...

  7. python圆形生成器_python中的生成器

    什么是生成器? 生成器是一个包含了特殊关键字yield的函数.当被调用的时候,生成器函数返回一个生成器.可以使用send,throw,close方法让生成器和外界交互. 生成器也是迭代器,但是它不仅仅 ...

  8. Python中生成器是什么?

    何为生成器 生成器的wiki页:https://en.wikipedia.org/wiki/Generator_(computer_programming) 在计算机科学中,生成器是特定的迭代器,它完 ...

  9. (转载)Python 应用发布技术

    (转载)Python 应用发布技术 2011年08月09日 分类: 脚本 2009-04-08 17:05 722人阅读 评论(0) 收藏 举报 1. Python 应用发布技术收集如何 将Py应用打 ...

最新文章

  1. PHPExcel使用-使用PHPExcel导出文件-导出MySQL数据
  2. 帝国cms7.5百度小程序针对搜索引擎自然搜索优化版生成静态版
  3. 开发asp.net2.0手机用网站 点滴[xgluxv]
  4. EntityFramework Core 3.x添加查询提示(NOLOCK)
  5. 关于string转整数
  6. 阿里开源首个移动AI项目,淘宝同款推理引擎
  7. 老男孩第31期杨海学习Linux决心书
  8. Alfresco 4 项目介绍
  9. Java 设计模式 代理模式
  10. ad09只在一定范围内查找相似对象_AD常用快捷键
  11. 快手短视频批量下载工具详细使用说明
  12. 2款QQ空间首页好看的psd源码
  13. 计算机学硕编码,怎么区分学硕和专硕代码
  14. 推荐-最新PSP游戏下载,不用注册直接下载!(1)
  15. mysql yum 安装
  16. 局域网中的通信子网和资源子网
  17. Android Root
  18. Goolgle knowledge graph API使用
  19. 老农斗杀巨型蜈蚣目击记
  20. 分布式高并发下,Actor模型如此优秀

热门文章

  1. Ubuntu16.04amp;amp;Windows 10双系统安装教程(UEFI模式)
  2. java使用Executor(执行器)管理线程
  3. cups支持的打印机列表_Win10“Microsoft Print to PDF”虚拟打印机不见了,如何找回?...
  4. matlab电类,985电气研二,有发过考研经验贴 电气电力类的有
  5. java thread safe_Java 线程安全 Thread-Safety
  6. redis哨兵模式没有切换主机_Redis哨兵(Sentinel)模式
  7. 数据结构知识点总结_大牛带你学 | 考研数据结构中线性表中顺序结构的知识点总结...
  8. mysql实现程序的动态链接_程序的链接和装入及Linux下动态链接的实现
  9. 计算机硬盘中病毒以后怎么办,计算机中病毒,格式化整个硬盘后还有?怎么办?...
  10. Nginx(七):nginx原理解析