码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器、生成器

时间:2020-02-07 22:15:21      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:算法   场景   展开   文件操作   UNC   公式   而不是   生成   技术   

生成器

  定义:

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

  举例:

    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不是在接受数据,仅仅是返回数据;

 

装饰器、生成器

标签:算法   场景   展开   文件操作   UNC   公式   而不是   生成   技术   

原文地址:https://www.cnblogs.com/hgqcore/p/12274131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!