列表生成式 与 生成器
列表生成式
- 借助for循环实现的列表生成式:
>>>[x*x for x in range(5)]
[0, 1, 4, 9, 16, 25]
- 也可以使用双重循环:
>>>[m+n for m in 'ABC' for y in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
三层或三层以上的循环较少用到
- for后加if判断作为过滤条件,注意由于是作为过滤条件,不可再加else
eg:
>>> [x for x in range(1, 11) if x % 2 == 0]
[2, 4, 6, 8, 10]
- for前加if...else表达式也可:
>>> [x if x % 2 == 0 else -x for x in range(1, 11)]
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
生成器generator
- 普通的generator
列表生成式中的[]改为()即可
eg:
>>> 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>
- 函数式复杂generator
若一个函数的定义中包括关键字yield,则该函数是generator;
函数是顺序执行,每次遇到return即返回;generator则是调用next()时执行,遇到yield返回,再次执行时从yield处继续执行。
eg:斐波那契数列生成器:
def fib(max):
n, a, b=0, 0, 1
while n<max:
yield b
a, b = b, a+b
n = n+1
return 'done'
打印generator的每一个元素
- 使用next()方法依次打印
eg:
>>>next(g)
0
....
但是打印到最后一个元素之后继续打印会出现StopIteration的错误
- for循环打印
generator是可迭代对象,可以用for循环打印,且不必考虑打印到最后一个元素之后的问题
eg:
for n in g:
print('g:',n)

浙公网安备 33010602011771号