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

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/sunshine-blog/p/8318832.html
Copyright © 2011-2022 走看看