python-day17--生成器

1.本质:就是迭代器

2.生成器函数:

def func():    a=1    b=2    yield a    #返回第一个值    yield b    #返回第二个值
ret = func()  #拿到一个生成器print(next(ret)) #取第一个值print(next(ret)) #取第二个值print(next(ret)) #取第三个值 会报错 因为没有第三个值

3.生成器监听文件输入的例子
import timedef tail(filename):    with open(filename) as f:        f.seek(0, 2) #从文件末尾算起        while True:            line = f.readline()  # 读取文件中新的文本行            if not line:                time.sleep(0.1)                continue            yield line

print(next(tail(‘tmp_file‘)))

4.#计算移动平均值
def averager():    total = 0    day = 0    avrage = 0    while True:        day_num  = yield avrage  #return avrage        total += day_num        day += 1        avrage = total/day

avg = averager()num = next(avg)  #激活生成器 avg.send(),什么都不send和next效果一样print(avg.send(10))  #传值 nextprint(avg.send(20))
5.传值:
#计算移动平均值def wrap(func):
    def inner(*args,**kwargs):        g = func(*args,**kwargs)        next(g)        return g    return inner

@wrapdef averager():    total = 0    day = 0    avrage = 0    while True:        day_num  = yield avrage  #return avrage        total += day_num        day += 1        avrage = total/day

g = averager()print(g.send(10))print(g.send(20))
6.
def func():    # for i in ‘AB‘:    #     yield i    yield from ‘AB‘    yield from [1,2,3]g = func()l = []l.append(next(g))l.append(next(g))l.append(next(g))l.append(next(g))l.append(next(g))print(l)

				
时间: 2024-10-11 20:42:03

python-day17--生成器的相关文章

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.生成器 >>> 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> StopItera

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,有很多种方法.第一