python里的生成器
author:headsen chen
date:2018-03-22 10:59:46
notice:This article created by headsen chen himself and not allowed to copy.or you will count law questions.
1,列表生产式:
a = [1,3,2]
--->
[ i*2 for i in range(10) ]
先用i循环产生的值 *2 ,生成的值就是列表的新元素
以前的实现方法(python软件里实现):
a = [ ]
for i in range(10):
a.append(i*2)
print(a)
作用:简化代码
扩展:传递变量i,也可以传递一个函数进去
[ func(i) for i in range(10)]
2,生成器generator:仅生成需要使用的元素,列表里用不到的元素就不生成,节省内存空间
实例:
( i*2 for i in range(10))
b = ( i*2 for i in range(10))
for i in b:
print(i)
作用:快速生成
[ i*2 for i in range(100000000) ] ----》 1分钟的时间生成,生成式写好后立即生成。
(补充:a = xxx \n len(a) 查看a生成到哪里了,取值a[10])
b = ( i*2 for i in range(1000000)) -----》瞬间完成,压根就不生成任何元素。调用的时候再生成
生成具体的元素:
for i in b:
print(i)
...
...
...
取值方法:
b._ _next_ _()
和列表的区别:调用的时候才生成
生成器取值的方法:
(1),只有用这一个next方法取值,取下一个值: b._ _next_ _(),实际中用next取值应用得比较少。
(2),只记住当前的位置,只记住当前位置的这个元素。从而达到节省内存的目的
3,利用函数来做生成器
3.1肺波拉起数列:除第一个第二个数外,任意一个数都可以由前两个数相加得到
此时用列表无法实现。可以用函数定义出:
def f(max):
n,a,b =0,0,1
while n<max:
print(b) ------------》改成 yield b 就成立生成器
a,b = b,a+b
n =n+1
f(10) -----》生成10个该数列:1,1,2,3,5,8,13,21,34,55
def f(max):
n,a,b =0,0,1
while n<max:
yield b
a,b = b,a+b
n =n+1
print(f(100)) ------------>调用方法 <generator object fib at 0x0000000000006CJSIF5645>
使用方法:
def f(max):
n,a,b =0,0,1
while n<max:
yield b
a,b = b,a+b
n =n+1
g = f(100)
print(g.__next__())
print(g.__next__())
...
--->
1
1
...
作用:上面的f函数是可以在程序外来随时中断的,又可以随时的恢复启用,中间可以夹杂别的程序。
当f程序是个很大的很慢的程序时,就可以在这中间夹杂别的程序了
如:
def f(max):
n,a,b =0,0,1
while n<max:
yield b
a,b = b,a+b
n =n+1
g = f(100)
print(g.__next__()) ---->1
print(g.__next__()) ---->1
print("do some other things")
print(g.__next__()) ----->2
print("do some other things")
print("do some other things")
print(g.__next__()) ----->3
print(g.__next__()) ----->5
例2:
def f(max):
n,a,b =0,0,1
while n<max:
yield b
a,b = b,a+b
n =n+1
return "done"
g = f(10)
print("========== start loop ==========")
for i in g:
print(i)
def f(max):
n,a,b =0,0,1
while n<max:
yield b
a,b = b,a+b
n =n+1
return "done"
g = f(10)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
运行:
报错一个"done"的异常错误。因为取值超过了定义的10次,已经取不到值了
改进方法:引进try:
def f(max):
n,a,b =0,0,1
while n<max:
yield b
a,b = b,a+b
n =n+1
return "done" -----------就是超值范围后的报错信息,异常的时候打印的消息。
g = f(10)
while True: ----------> 死循环
try: ---------------> s是一种不断的抓的方法
x = next(g)
print("g:",x)
except StopIteration as e:
print("Generator return value:",e.value)
break
意思是try下面的代码一旦出这个错:StopIteration (出来别的任何错都不处理)
就执行:print("Generator return value:",e.value) 和break 跳出循环
总结:代码带有yield的就不叫函数了。就是一个生成器了。
python里的生成器的更多相关文章
- Python中的生成器与yield
对于python中的yield有些疑惑,然后在StackOverflow上看到了一篇回答,所以搬运过来了,英文好的直接看原文吧. 可迭代对象 当你创建一个列表的时候,你可以一个接一个地读取其中的项.一 ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- 【python】迭代器&生成器
源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- python中的生成器函数是如何工作的?
以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...
- python记录_day12 生成器
什么是生成器? 生成器的实质就是迭代器,我们能够从生成器中一个一的拿值 python中获取生成器的方式有三种: 1.通过生成器函数 2.通过生成器表达式 3.通过数据转换也可以获取生成器(某些对象执行 ...
- Python学习-39.Python中的生成器
先回顾列表解释 lista = range(10) listb = [elem * elem for elem in lista] 那么listb就将会是0至9的二次方. 现在有这么一个需求,需要存储 ...
- python迭代器、生成器、装饰器
1 迭代器 这里我们先来回顾一下什么是可迭代对象(Iterable)? 可以直接作用于for循环的对象统称为可迭代对象,即Iterable. # 一是集合数据类型,如list.tuple.dict.s ...
- python中的生成器(二)
一. 剖析一下生成器对象 先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象 def gen(): print('start ..') for i in range(3): yield ...
随机推荐
- (一)Mina源代码解析之总体架构
Apache Mina Server 是一个网络通信应用框架.也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也能够提供JAVA 对象的序列化服务.虚拟机管道通信服务等).M ...
- IOS性能调优系列:使用Allocation动态分析内存使用情况
硬广:<IOS性能调优系列>第三篇,持续更新,欢迎关注. <IOS性能调优系列:Analyze静态分析>介绍了使用静态分析方法查找IOS内存泄漏的方法,<IOS性能调优系 ...
- DevExpress中chartControl中实现统计图功能
public partial class Form1 : DevExpress.XtraEditors.XtraForm { public Form1() { InitializeComponent( ...
- 阿里云maven 库
阿里云maven 库 , 好用,速度快 maven setting.xml https://github.com/ae6623/Zebra/blob/master/maven-repo-setting ...
- mysql数据类型与运算符
一.数据类型 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediu ...
- unity, editorWindow update计时
对于editorWindow,Time.deltaTime不起作用,所以需用下面方法对update进行计时: public class myEditorWindow : EditorWindow{ p ...
- 带密匙的php加密解密代码
php加密解密示例,代码如下: <?php $id = "http://www.jbxue.com"; $token = encrypt($id, 'E', 'jbxue') ...
- angular学习疑问总结
服务里返回的数据是不是只能传给控制器,而不能传给指令呢?如果是的话那么指令只能通过配置scope属性来访问控制器里的数据
- nyoj 38 布线问题 Kruskal and Prim
布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的 ...
- Apache Avro:一个新的数据交换格式
原文: http://blog.cloudera.com/blog/2009/11/avro-a-new-format-for-data-interchange/ 注:由于个人英语能力有限,翻译不准确 ...