python中的列表生成式与生成器
列表生成式
一、什么是列表生成式?
列表生成式(list comprehensions),是python中内置的强大用来创建列表的生成式。
二、具体的用法是什么?
生成一个序列
>>> list(range(11))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成一个元素平方的序列:使用for循环
>>> s=list(range(11)) >>> L=[] >>> for i in s: L.append(i**2) >>> print(L) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
更加简便的方法:使用列表生成式
>>> [x*x for x in range(11)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
添加if判断:
>>> [x*x for x in range(11) if x%2==0]# x取余等于0 [0, 4, 16, 36, 64, 100]
生成一个全排列:孟德尔遗传杂交定律
>>> [x+y for x in 'AB' for y in 'ab'] ['Aa', 'Ab', 'Ba', 'Bb']
列表生成式也可以使用两个变量来生成list:
>>> d={'A':'a','B':'b','C':'c'} >>> [k+'='+v for k,v in d.items()] ['A=a', 'B=b', 'C=c'] >>>
生成器
列表生成器可以直接生成一个列表,小的列表好商量,但是一个百万级的列表,内存就有可能吃不消了,如果只需要其中的几个数值,就是浪费系统资源了,使用生成器保存的是列表的算法,根据每一次的循环进行计算的机制,即generator。
创建一个generator:
>>> g=(x*x for x in range(11)) >>> g <generator object <genexpr> at 0x0311BFC0>
打印出generator的每一个元素:
>>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25
太麻烦,可以这样:
>>> from collections import Iterable >>> isinstance(g,Iterable) True
生成器是可迭代的对象:
>>> for x in g: print(x) 36 49 64 81
生成器的两种形式:
上述是生成器的第一种形式,即列表生成式直接可以修改成生成器:[]---()
生成器的第二种形式,类似于函数的形式:
对于一个斐波拉契数列:
#斐波拉契数列 L=[] def fib(x): n,a,b =0,0,1 while n<x: a,b=b,a+b n=n+1 L.append(b) print(L)
运行:
>>> fib(11)
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
更改成生成器:
def fib(x): n,a,b =0,0,1 while n<x: a,b=b,a+b n=n+1 yield b
运行:
>>> fib(11)
<generator object fib at 0x0319B7E0>
>>> for x in fib(11): print(x) 1 2 3 5 8 13 21 34 55 89 144 >>>
第二种形式:要把fib
函数变成generator,只需要把print(b)
改为yield b
就可以了: