zoukankan      html  css  js  c++  java
  • Python之列表生成式、生成器

    列表生成式

    ——可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁:

    >>> [x * x for x in range(1, 11)]

    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    >>> [x * x for x in range(1, 11) if x % 2 == 0]

    [4, 16, 36, 64, 100]

    >>> [m + n for m in 'ABC' for n in 'XYZ']

    ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

    生成器(Generator)

    ——通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量是有限的。而且,若创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。在Python中,这种一边循环一边计算的机制,称为生成器(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 0x104feab40>

    通过generatornext()方法,可以实现一个个打印出来。generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

     

    或:

    >>> g = (x * x for x in range(10))

    >>> for n in g:...     

         print n

         ...

    0

    1

    4

    9

    16

    25

    36

    49

    64

    81

    • 第二种方法:如果一个函数定义中包含 yield 关键字,那么这个函数在 Python 中被称之为 generator(生成器)

    (菲波那切数列)

    def fab(max):

         n, a, b = 0, 0, 1

         while n < max:

             yield b

             a, b = b, a + b

             n = n + 1

    执行

    1

    2

    3

    4

    5

    6

    7

    8

    9

    >>> for n in fab(5):

        print n

         

    1

    1

    2

    3

    5

     简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

    也可以手动调用 fab(5) next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    >>> f = fab(3)

    >>> f.next()

    1

    >>> f.next()

    1

    >>> f.next()

    2

    >>> f.next()

    Traceback (most recent call last):

      File "<pyshell#62>", line 1, in <module>

        f.next()

    StopIteration

  • 相关阅读:
    递归函数的原理
    html布局-子div浮动后,父容器撑不开解决
    权限设计——控制显示字段——设计思考
    winform上传文件到服务器——资料整理
    windows server自动化发布——技术积累与整理
    Docker——概念学习
    javascript中的var,let,const关键字
    Web前端面试图
    上传与预览图片
    每个程序员都应该知道延迟数—Latency Numbers Every Programmer Should Know
  • 原文地址:https://www.cnblogs.com/sunshine-blog/p/8318832.html
Copyright © 2011-2022 走看看