生成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']
for
前面是一个表达式,需要算出结果,把if
写在for
前面必须加else
,否则报错一边循环一边计算的机制,称为生成器: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。