装饰器生成器

Posted hgqcore

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器生成器相关的知识,希望对你有一定的参考价值。

生成器

  定义:

    生成器是在存在内存中的公式(专业点叫算法); 

  举例:

    list1=(i for i in range(5)) 和 list2=[ i for i in range(5)]

  技术图片

  可以看出list1是generator object对象内存地址(函数或计算公式);而list2在内存中是实实在在的数据[0,1,2,3,4]

  应用场景:数据比较大,一下存到内存中会消耗很大内存;

    例如:list2=[ i for i in range(200000000000)];

      文件操作:with open(‘file_1.txt‘, ‘r‘, encoding="utf-8")  as f:  如果file_1.txt这个文件大小为100G; 

       使用f.read() f.readline()这一下子就内存崩了;

       而使用for  i  in  f:这样形成迭代器;每次f.readline()时内存中只有一条数据,内存开销就会变小;

  使用:

     1.list1=(i for i in range(10))  仅仅把列表的【】变为();

     2.像文件操作for f in file:

     3. 关键字yield    ----本文也主要针对这个展开;

  函数:

    yield  next()  __next__()  send()

    yield:关键字 会把函数拦腰截断  两个作用:1.类似return 返回数据;2.接受数据;

    技术图片

    1.当无yield关键字,func函数就是一个普通函数;正常调用func()时,会像红线标识一样,一下走到底,然后结束本次循环,再次开始下一次循环;

    2.有yield关键字,标志着func函数是一个generator函数,func()也不再是函数的调用;而是generator生成器的启动;f.__next__()或者next(f)表示函数的执行;但是yield会把func函数,拦腰截断;  一次f.__next__()只能执行到yield处:此时发生三种事情:1.函数停留在这里;2.把x返回数据x给f.__next__();具体可以换成下print(f.__next__())测试下;3.等待接受数据(x是要返回的数据,不是接受数据变量)

    3.f.send("hello")  表示发送数据 给生成器停留处;本文也就是temp = yield x 切记  不是x为"hello",而是temp为"hello";

  注意:

    1func()  不再表示函数的调用,而是表示启动generator函数;func().__next__() generator反函数才会执行;

    2.yield  x : 表示返回x,  而不是func().send("hello")时,x不是在接受数据,仅仅是返回数据;

 

以上是关于装饰器生成器的主要内容,如果未能解决你的问题,请参考以下文章

装饰器生成器迭代器

装饰器生成器迭代器及python中内置函数的使用

关于装饰器迭代器生成器以及其它一些内容的整理

装饰器迭代器生成器

9.23闭包函数/装饰器/迭代器/生成器

第十三天 叠加多个装饰器 迭代器 生成器