6.生成器

2022-04-06  本文已影响0人  软件开发技术修炼

迭代器与生成器区别是:
生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用;

生成器定义
本质上是动态生成迭代的值,使用完直接丢弃,可以有效节省内存空间,但这些值只能被迭代一次。
1、其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写iter()和next()方法了,只需要一个yiled关键字。
2、生成器没有长度
3、生成器是只能遍历一次的

优点:
1、节省内存,每次生成一个元素,而不是计算后保存,如保存使用list(xxx)
2、提速,占内存更小
3、各种花式循环,节省代码长度

yield函数
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个生成函数;
yield其实从某个角度来看,就是一个return。不过它返回的就是一个可迭代的对象generator;
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行;
调用一个生成器函数,返回的是一个迭代器对象。

示例1:函数中包含yield就是生成器函数,不能简单的通过函数名调用

def method(n):
    for i in range(n):
        yield i ** 2

method(4)   //不会打印任何东西 
//分析:
使用了yield之后,run()函数就是一个生成器函数,不是普通函数,不能通过函数名调用,生成器函数在迭代时候才会调用

示例2:迭代调用生成器函数

#调用方式一:
i=method(5)
while True:     # while循环迭代
    try:
        print(next(i))
    except:
        StopIteration
#结果:只会输出:0  1  4   9   16

#调用方式二:
for j in method(6):     # for循环迭代
    print(j)  

#结果:只会输出:0  1  4   9   16  25

示例3:生成器执行过程:循环执行了一次yield后,挂起函数状态,迭代取结果,然后执行第二次yield,挂起函数状态,再迭代取结果,执行第三次yield……

def g():
  for i in range(3):
    yield i
g = g()
next(g)
next(g)
next(g)
next(g)
#结果:
0
1
2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

示例4:生成器按指定大小读取文件

def method(file):
    size = 1024
    with open(file,encoding="utf-8") as readfile:
        while True:
            block=readfile.read(size)      //每次读固定长度到缓冲区
            if block:
                yield block
            else:
                return         //读到文件末尾则退出
for i in method("D:\\PythonScriptDictory\\py3.5\\test\\new_expand.txt"):
    print(i)
或者写成
with open(file,encoding="utf-8") as readfile:
    block = readfile.read(size)
    while block:
        yield block
        block=readfile.read(size)

总结:

生成器表达式:
g = (x * x for x in range(10))
这样的g就是一个generator
生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存。
应用场景:
生成器是一种惰性的序列,如果我们需要创建一个 0~xxxxxxxxx 的序列,这样大的序列创建出来会占用内存,生成器就解决这样的问题 。

上一篇 下一篇

猜你喜欢

热点阅读