列表生成式
- 借助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)