zoukankan      html  css  js  c++  java
  • python 生成器

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

    所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>

     通过next()函数获得generator的下一个返回值:

    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    4
    >>> next(g)
    9
    >>> next(g)
    16

    使用for循环,generator也是可迭代对象:

    >>> g = (x * x for x in range(10))
    >>> for n in g:
    ...     print(n)
    ... 
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81

    我们创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误。

    通过yield构建生成器

    如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

    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()不是普通函数,而是generator,在执行过程中,遇到yield就中断,下次又继续执行。

    同样作为generator,可以用next()和for。

    详见https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

  • 相关阅读:
    JavaScript设置受信任站点 允许未签名Activex运行
    Serene .NET 安装中“SCTask”任务意外失败的问题解决
    Sharepoint2010之父子表实现
    IOS多线程及队列的使用
    一个界面中如何使用两个tableView
    //获得设备型号
    UINavigationController导航栏中添加多个UIBarButtonItem
    ios设备的尺寸不大敏感[UIScreen mainScreen
    OC语言description方法和sel
    Objective-c 代理模式(delegate)
  • 原文地址:https://www.cnblogs.com/imageSet/p/7524139.html
Copyright © 2011-2022 走看看