标签:算法 场景 展开 文件操作 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