列表生成器
举例list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
L = [] for x in range(1, 11): … L.append(x * x) … L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[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’]
d = {‘x’: ‘A’, ‘y’: ‘B’, ‘z’: ‘C’ } [k + ‘=’ + v for k, v in d.items()] [‘y=B’, ‘x=A’, ‘z=C’]
生成器
列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 要创建一个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 at 0x1022ef630>
如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:g = (x * x for x in range(10)) for n in g: … print(n) … 0 1 4 9 16 25 36 49 64 81
用generator写一个斐波那契数列def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return ‘done’