1. 生成器

生成器可以理想为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象。

2. 生成器分类及在python中的表现形式

  • 生成器函数:利用常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的运行状态,以便下次从离开的地方继续执行。
 def test():
yield 1
yield 2
yield 3
res = test()
print(next(res))
print(next(res))
print(next(res)) """
运行结果:
1
2
3
结果分析:下一次next从上一次next返回退出的地方进入
"""
  • 生成器表达式:类似于列表解析,但是,生成器返回按需产生结果的一个对象,而不是一次性构建一个结果列表。
 test = (item for item in range(4))
print(next(test))
print(next(test))
print(next(test)) """
运行结果:
0
1
2
结果分析:下一次next从上一次next返回退出的地方进入
"""

3. 生成器的优点

  • 延迟计算。即一次只返回一个结果,也就是说,生成器不会一次性生成所有的结果,这对于大数据量的处理将会非常有用。
  • 生成器还能有效地提高代码的可读性。

注意:生成器只能从头到尾遍历一次。

4. 生成器实例1

"人口信息.txt"文件内容:

 {"name":"北京","population":1600000}
{"name":"南京","population":2100000}
{"name":"山东","population":2800000}
{"name":"山西","population":1800000}

"bin.py"文件内容:

 def get_information_population(filename):
with open(filename) as p:
for line in p:
res = eval(line)
yield res["population"] res = get_information_population("人口信息.txt")
sum_people = sum(res)
for item in res:
print(item) """
结果分析:执行上面这段代码,将不会有任何输出,这是因为,生成器只能遍历一次。在我们执行sum语句的时候,就已经遍历了一次生成器,从而,在之后当我们再次遍历生成器的时候,将不会有任何记录。所以,上面的代码不会有任何的输出
因此,生成器的使用过程中,需要特别注意的就是:生成器只能遍历一次
"""

5. 生成器实例2

 def test():
x = "一"
print("第一次")
print(x)
x = yield 1
print("第二次")
print(x)
yield 2 res = test()
print(next(res))
print(res.send("二")) """
运行结果:
第一次
一
1
第二次
二
2
结果分析:yield 3相当于return控制的是函数的返回值。x = yield的另外一个特征,接受send传过来的值,赋值给x
"""

6. 生产者——消费者模型

 import time
def consumer(name):
print("I am %s, I start to count" %name)
while True:
num = yield
time.sleep(1)
print("I am %s, I have counted %s" %(name,num))
def producer():
c1 = consumer("Alix")
c2 = consumer("Bob")
next(c1)
next(c2)
for item in range(1,3,1):
time.sleep(1)
c1.send(item)
c2.send(item)
producer() """
运行结果:
I am Alix, I start to count
I am Bob, I start to count
I am Alix, I have counted 1
I am Bob, I have counted 1
I am Alix, I have counted 2
I am Bob, I have counted 2
"""

day04.3-生成器的更多相关文章

  1. day04 迭代器&生成器&装饰器

    目录   1.迭代器 2.生成器 3.推导式 4.匿名函数 5.内置函数 6.递归 7.闭包 8.装饰器 一.迭代器 特点: 1. 省内存 2. 只能向前. 不能反复 3. 惰性机制 让不同的数据类型 ...

  2. Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器

    目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...

  3. python开发学习-day04(迭代器、生成器、装饰器、二分查找、正则)

    s12-20160123-day04 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  4. day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数

    回顾下上次的内容 转码过程: 先decode  为 Unicode(万国码 ) 然后encode 成需要的格式     3.0 默认是Unicode  不是UTF-8 所以不需要指定  如果非要转为U ...

  5. Python基础(函数部分)-day04

    写在前面 上课第四天,打卡: 加勒比海盗今天上映:端午节公司发的粽子很有范! 一.函数的基本概念 - 函数是什么?  函数,就是一个'锤子',一个具有特定功能的'锤子',使用者可以在适当的时候使用这个 ...

  6. 介绍一款原创的四则运算算式生成器:CalculateIt2

    家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...

  7. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  8. Objective-C 生成器模式 -- 简单实用和说明

    1.生成器模式的定义 将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 2.生成器模式的UML Builder :生成器接口,定义创建一个Product各个部件的操作 Con ...

  9. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)

    系列目录 这一节我们要着手建立系统管理员表,但发布之前,我先发布一个代码生成器给大家先用着. 这个生成器是为这个项目而生的,理论不能用于其他项目,而且写得比较潦草,但能用 下载地址 有兴趣要生成器源码 ...

  10. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

随机推荐

  1. js小功能

    1 删除左右两端的空格 //删除左右两端的空格 function trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 2 ...

  2. 在SharePoint解决方案中使用JavaScript (2) – 模块化

    本文是在SharePoint中使用JavaScript的第二篇文章,前面的文章包括: 在SharePoint解决方案中使用JavaScript (0) 在SharePoint解决方案中使用JavaSc ...

  3. 15-I hate it (HDU1754:线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754     相似例题:  敌兵布阵  http://www.cnblogs.com/zhumengdexiao ...

  4. 抓包工具Fidder移动端HTTP请求抓包详解

    第一步:下载神器Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler打开Fiddler,     ...

  5. loadrunner12-错误 -26366: 找不到 web_reg_find 的“Text=19728.00”

    转:检查点(web_reg_find函数详解) LR检查点 设置检查点的目的不只是为了验证我们的脚本没有错误,而更重要的是一个规范问题,如何使得测试结果更具有说服力,因此建议所有的测试脚本中都添加检查 ...

  6. code1099 字串变换

    BFS 听上去蛮简单的,实际编程复杂度较高(至少一个快睡着的人是这么认为的...) 抄的题解(感谢题解的作者<'_'>): #include<queue> #include&l ...

  7. easyui 获取当前页签选中的名称

    parent.parent.$("#tabs").tabs('getSelected').panel('options').title == "收藏夹管理"

  8. Redis 数据库学习

    安装(mac) 使用homebrew安装,命令是:brew install redis. 安装完成后启动命令:brew services start redis. 使用命令redis-cli进入red ...

  9. Yii2在Form中处理短信验证码的Validator,耦合度最低的短信验证码验证方式

    短信验证码在目前大多数web应用中都会有,本文介绍一个基于Yii2 Validator方式的验证码验证方式. 在其他文章中看到的方式大多比较难做到一次封装,多次重用. 使用此方式的好处自然不用多说,V ...

  10. python读写操作csv及excle文件

    1.python读写csv文件 import csv #读取csv文件内容方法1 csv_file = csv.reader(open('testdata.csv','r')) next(csv_fi ...