python 的生成器

生成器(generator)

在Python中,这种一边循环一边计算的机制,称为生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。

而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了

创建生成器只需要将类别生成式的[]改成()

文章参考廖雪峰老师官网https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128#0

#生成器
g=(x*x for x in range(10))  #<generator object <genexpr> at 0x000002670CC45E48>


#如果要一个个打印出来,可以通过next()函数得到下一个返回值
next(g)  #0
next(g)  #1
next(g)  #4

#每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误

当然生成器也可以使用for循环迭代

#创建一个生成器,并输出每一个值
g=(x*x for x in range(1,10))
for i in g:
    print(i)

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

def fib(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
        n=n+1
    return 'done'

fib(10)

函数中使用生成器,如果函数中含有yield关键字,那么函数就是一个generator:

函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行;

把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代

def fib(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n=n+1
    return 'done'

fib(10)  #<generator object fib at 0x104feaaa0>

试着用生成器输出杨辉三角

 

#杨辉三角
def triangles():

    L = [1]

    while 1:

        yield L  #执行完后面的,又再此基础上执行下一次

        L = [L[n] + L[n+1] for n in range(len(L) - 1)]  #先处理中间的

        L.insert(0,1)  #再在添加1

        L.append(1)  #再在尾添加1

#输出十行
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)

 

 






 

posted on 2020-07-13 18:51  小小喽啰  阅读(169)  评论(0编辑  收藏  举报