在Python中,这种一边循环一边计算的机制,称为生成器:generator。

生成器保存的是算法,每次调用 next() ,就计算出 下一个元素的值,
直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常
当然,这种不断调用 next() 实在是太变态了,正确的方法是使用 for 循环,因为生成器也是可迭代对象。
所以,我们创建了一个生成器后,基本上永远不会调用 next() ,
而是通过 for 循环来迭代它,并且不需要关心 StopIteration 异常。 创建生成器的方法:
1、只要把一个列表生成时的[]改为()
2、定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator 用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中
while True:
try:
x = next(g)
print("value:%d"%x)
except StopIteration as e:
print("生成器返回值:%s"%e.value)
break 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。
def gen():
i = 0
while i<5:
temp = yield i
print(temp)
i+=1 r = gen()
可以通过next(r)或者 r.__next__()方法获取下一个值

生成器的特点:
1、节约内存
2、迭代到下一次的调用时,所使用的参数都是第一次所保留下的,
即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

python3 - 生成器genarator的更多相关文章

  1. 第十三天python3 生成器yield

    生成器generator 生成器指的是生成器对象,可由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象: 生成器函数 函数体中包含yield语句的函数,返 ...

  2. python3 生成器&迭代器

    #Author by Andy#_*_ coding:utf-8 _*_import timefrom collections import Iterable#列表生成式def func(): lis ...

  3. python3 生成器初识 NLP第五条

    话不多说,先把第五条抄一遍: 五,沟通的意义在于对方的回应 沟通没有对与错,只有“有效果”或者“没有效果”之分. 自己说得多“对”没有意义,对方收到你想表达的讯息才是沟通的意义. 因此自己说什么不重要 ...

  4. python3 生成器和生成器表达式

    ''' 生成器:函数中有yield就是生成器函数 生成器本质是一个迭代器 yield后面的值会作为返回值返回. ''' def func(): print("apple") pri ...

  5. Python3 生成器

    生成器(genetor): 1>生成器只有在调用的时候才会生成相应的数据: 2>生成器只记录当前位置,有一个__next__()方法 3>yield可以实现单线程先的并发运算 1.列 ...

  6. python3 生成器表达式

    生成器表达式 [i for i in range(100)] #列表解析 与列表解析的不同是,列表解析用中括号,生成器表达式用小括号 g = (i for i in range(1000)) #生成器 ...

  7. python3 生成器笔记

    #生成器def MyDemo(M): for i in range(M): yield i**2for item in MyDemo(9): print(item) # #生成器import sysa ...

  8. (十)python3 生成器

    生成器(generator):在 Python 中,不必创建完整的 list,从而节省大量的空间.一边循环一边计算的机制. 创建一个 generator,有很多种方法.第一种方法很简单,只要把一个列表 ...

  9. 净心诀---python3生成器进阶

    列表推导式 把需要用一个函数写成的小功能,利用一行表达式完成 例子: l = [1,2,3,4,5] # 所有的偶数都放到新的列表中 # 正常函数 def Lst(): li = [] for i i ...

随机推荐

  1. 【微信转载】Google是如何做测试的

    就 目前的软件公司而言,Google无疑是在开放和创新力方面做得最好的.而如何支撑Google这种快速地扩张的研发能力以及迭代速度,并且产品质量总是 一如以往的能给人们很棒的用户体验?这是一个值得我们 ...

  2. What most young programmers need to learn

    In the past 7.5 years I have supervised over a dozen programming interns at Ronimo and have seen hun ...

  3. web报表工具FineReport常见的数据集报错错误代码和解释

    在使用finereport制作报表.若预览错误发生.非常多朋友便手忙脚乱不知所措了,事实上没什么,仅仅要看懂报错代码和含义.能够非常快的排除错误,这里我就分享一下finereport的数据集报错错误代 ...

  4. 区分Activity的四种加载模式

    在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity.可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity. ...

  5. (二)Linux——Linux常用指令

    1. 文件目录操作命令 ls 显示文件和目录列表     -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 mkdir 创建目录 -p 父目录不存在情况下先生成父目录 cd 切换目录 ...

  6. JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计

    原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...

  7. 哈希—— POJ 3349 Snowflake Snow Snowflakes

    相应POJ题目:点击打开链接 Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions ...

  8. linux命令ulimit 系统限制你打开一些资源数

    #ulimit -a 查看系统的一些限制,比如在做并发测试时ab命令的请求书不能超过 1024个. 要更改 #ulimit -n 10240

  9. Atitit.aticmd v4  新特性q39 添加定时器释放功能

    Atitit.aticmd v4  新特性q39 添加定时器释放功能 V1  实现兰cmd V2 标准输入,标准输出,标准错误与重新定向 V3  stdout stderr统一重新定向 V4  添加定 ...

  10. Stage3D&Away3D整理ppt

    资料下载地址:http://files.cnblogs.com/xignzou/away3D%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0%E5%88%86%E4%BA%AB ...