列表生成器 List Comprehension

生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))

生成[1x1, 2x2, 3x3, ..., 10x10]

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

for循环后面可以加上if判断,筛选出仅偶数的平方:

>>> [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

一边循环一边计算的机制,称为生成器:generator,可以节省大量内存空间 只要把一个列表生成式的[]改成(),就创建了一个generator

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

>>> next(g)
0
>>> next(g)
1

定义generator的另一种方法: 如果一个函数定义中包含yield关键字,那么这个函数就是一个generator函数,调用一个generator函数将返回一个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'
>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>

generator函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

调用generator函数会创建一个generator对象,多次调用generator函数会创建多个相互独立的generator。

捕获返回值