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. 压力测试工具--Siege

    Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力.可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行.s ...

  2. ZPL语言说明文档

    ■格式命令(format commands) 以︿开始 用于设定标签格式与数据 多条格式指令按顺序执行 ■控制指令(control commands) 以~开始 迫使打印机立即执行某一个指令的操作 可 ...

  3. 3d点云与cad模型

    https://stackoverflow.com/questions/19000096/match-3d-point-cloud-to-cad-model

  4. Sed命令n,N,d,D,p,P,h,H,g,G,x解析3

    摘自:https://blog.csdn.net/WMSOK/article/details/78463199 Sed命令n,N,d,D,p,P,h,H,g,G,x解析 2017年11月06日 23: ...

  5. 无废话 Thrift 之 Hello World( PHP 版).

    Thrift 不再介绍.体验一把 PHP 的Server , PHP 的Client. 0.安装,装备环境,不表,运行 thrift -version 看到版本就行. 1.写 HelloThrift. ...

  6. 3.1.7 线程阻塞工具类:LockSupport

    package 第三章.线程阻塞工具LockSupport; import java.util.concurrent.locks.LockSupport; /** * Created by zzq o ...

  7. 从零开始学习前端JAVASCRIPT — JavaScript中this指向的四种情况

    JavaScript中this的四种情况(非严格模式) 1.当this所在函数是事件处理函数时,this指向事件源.2.当this所在函数是构造函数时,this指向new出来的对象.3.this所在函 ...

  8. review一个javascript功能函数

    近半年来一直觉得自己在技术上好像左右挣扎,技术没啥提升,看书看不进,自学还挺慢.写出来的东西,自己都觉得不满意.让自己也用庸人自扰的感觉. 最近,在工作中,有一个小小的功能需要实现,这个功能非常简单, ...

  9. 编写高质量代码改善C#程序的157个建议——建议147:重构多个相关属性为一个类

    建议147:重构多个相关属性为一个类 若存在多个相关属性,就应该考虑是否将其重构为一个类.查看如下类: class Person { public string Address { get; set; ...

  10. 编写高质量代码改善C#程序的157个建议——建议98:用params减少重复参数

    建议98:用params减少重复参数 如果方法的参数数目不定,且参数类型一致,则可以使用params关键字减少重复参数声明. void Method1(string str, object a){} ...