zoukankan      html  css  js  c++  java
  • 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)





  • 相关阅读:
    MySQL(错误1064)
    如何判断是手机还是电脑访问网站
    Oracle表分区
    分离Date数据
    多对多
    一对多
    SQLalchemy基础
    paramiko上传下载
    paramiko
    automap
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/13295038.html
Copyright © 2011-2022 走看看