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. 使用avalon 实现一个序列号功能

    avalon"操作数据即操作DOM"的能力,让我们可以专致于业务,写出更专业,更优雅,更易维护的代码来.现在让我们看看如何实现一个序列号输入功能.它的需求以下: 每输入4个字符就跳 ...

  2. Mysql合并两列数据

    实例: UPDATE x_yiyuanpinggu_nengli SET ch_yuzhongfangxiang = CONCAT(ch_yuanyuzhong,ch_mubiaoyuzhong) M ...

  3. 面试------Android 版本之前的差异(常见,欢迎补充)。

    不管你技术如何,只要背点这个,能忽悠倒一片.. 1.WebView JS漏洞 ,Android4.2之前 ,解决办法,不用addJavascriptInterface,webchrome的onJsPr ...

  4. ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数

    有程序没关闭游标, --打开了哪些游标 select * from v$open_cursor 在open cursor之后一定要注意要close cursor(在store procedure里更应 ...

  5. www请求用到的Unescape

    //发送请求          WWW w = new WWW(url); //web服务器返回          yield return w;        if (!string.IsNullO ...

  6. Hibernate一对多操作

    --------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...

  7. 每个内存大小:sudo dmidecode -t memory |grep -A16 "Memory Device$" |grep "Size:"

    CPU: 型号:grep "model name" /proc/cpuinfo |awk -F ':' '{print $NF}' 数量:lscpu |grep "CPU ...

  8. OC中数组排序总结

    过完节回来,感觉很多东西都生疏了.总结一下数组的排序.应该不会太完美,后续添加补充. OC中的数组排序方法其实不太多,要根据不同的使用场景来使用不同的方法.Foundation框架中一般用到一下几个方 ...

  9. linux openjdk环境变量配置

    下载openjdk : https://jdk.java.net/ tar -xvf ... nano ~/.bashrc export JAVA_HOME=... export PATH=$JAVA ...

  10. 黑盒测试实践-任务进度-Day04

    任务进度11-29 使用工具 selenium 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了前两天的学习任务的安排,以下是大家的任务进度: 华同学(任务1) 1.和其他小 ...