python的生成器

1.生成器

>>> def func1():
...     yield 0
...     yield 1
...
>>> a=func1()
>>> a.next()
0
>>> a.next()
1
>>> a.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

当函数中有yield字段,就代表这是个生成器,生成器运行到yield字段时就会挂起,并返回yield后面的值,当运行a.next()时,函数会再次启动。

所以yield类似于return,只不过一个函数可以有多个yield,而且可以返回多个yield,而不像return一样,return完一个值,函数就结束了。

def f():
    a=1
    while 1:
        a=a+1
        yield a
a=f()
for i in  a:
    if i > 100:break
    print i

2..发送数据给生成器

>>> def f():
...     n=1
...     while 1:
...         n=(yield n)
...
>>> a=f()
>>> a.next()
1
>>> a.next() #这时n为none,所以没有输出

>>> a.send(10) #这时n为10,输出10
10
>>> a.next()  #这时n为none,所以没有输出

这里可以在生成器挂起是发送变量给生成器

3.一个有趣的库:pipe

>>> from pipe import *
>>> range(5)|add
10
>>> range(5)| where (lambda x:x if x>3 else 0)|add
4

可以实现类似于linux管道的功能

参考:http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html

python的生成器

时间: 2024-12-30 00:07:18

python的生成器的相关文章

python yeild 生成器

python yeild  生成器 生成器函数在生成值后自动挂起并且暂停它的执行和状态(常常在从头计算整个系列的值或者手动保存和恢复类中的状态时,作为一种解决方案) 生成器在被挂起时自动保存状态,yield将函数挂起后将向调用者返回一个值 ////////////////经过单步执行 可以看到(1)和(2)是交替执行的 >>> def  gensqures(N):       ////(1) """""" for i in ra

python 列表生成器

python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 如果python也这么写,那么真该看下python的基础教程了~ 但要注意的是,需要加一个[]来,否则会报错... 在上面的例子中,不仅可以嵌套for,甚至可以嵌套if语句 再看看,原来是什么样子 两个循环呢? 原来可能是这样的? 现在可以这样了!!!

python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延迟,是指在需要的时候才产生结果,而不是立即产生结果.这样在需要的时候才去调用结果,而不是将结果提前存储起来要节约内存.比如用列表的形式存放较大数据将会占用不少内存.这是生成器的主要好处.比如大数据中,使用生成器来调取数据结果而不是列表来处理数据,因为这样可以节约内存. 2.迭代到下一次的调用时,所使

python 迭代器&amp;&amp;生成器

有一篇文章写得迭代器和生成器,写得很好:https://www.cnblogs.com/wj-1314/p/8490822.html #列表生成器print([i*2 for i in range(10)]) #生成器:调用时才会产生相应的数据,不调用时不暂用内存,同时只记住当前的位置,只有一个__next__()方法b=(i*2 for i in range(10))for i in b: print(i) 什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量

python中生成器对象和return 还有循环的区别

python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因为return后面就不能跟任何东西,意味着函数的结束.那么我们完全可以这么做: def main(): for i in range(1,100): yield i 这样就等于生成了一个循环返回对象,特别在爬虫scrapy中较为常见!yeild和return还有for 上本质有什么区别呢?其实很简单

python迭代器,生成器,推导式

可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象. 内置函数:dir() print(dir(str)) 判断一个对象是否是可迭代对象: print('iter' in dir(str)) 优点: 直观. 操作方法较多. 缺点: 占内存. 不能迭代取值(索引,字典的key). 迭代器 字面意

python 迭代器 生成器 装饰器

迭代器 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. names = iter(['sun', 'ibm', 'sunny']) print(names) print(names.__next__()) print(names.__next__()) print(names.__next__()) print(

Python:生成器

生成器是Python中的一个高级用法,有段时间我对生成器的理解颇为费劲,直到我看到一句话"yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行"后,让我恍然大悟,这是生成器中的状态挂起,这句话让我想起了在大学时玩ARM单片机时经常碰到的一个概念--中断,单片机在遇到中断信号时,处理中断程序前也要先保护现场,即系统要在执行中断程序之前,必须保存当前处理机程序状态字PSW和程序计数器PC等的值,待中断程序执行完成后在回复现场继续执行下面的程序.仔细想想,个人

python 之生成器

通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了. 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generator. 要创建一个generator,有很多种方法.第一