Python之道–列表解析和生成器

Python版本:2.7.4
主机环境:Gentoo with Linux Kernel 3.4.36
原创作品,转载请标明: http://blog.geekcome.com/archives/78

列表解析完成的功能可以使用for循环替代或者map调用来替代。对于刚开始使用Python的初学者,通常使用简单的for循环,逻辑清晰,这样会容易理解,特别是在嵌套的时候。

性能对比:map调用比等效的for循环要快两倍,而列表解析往往比map解析要稍快一些。
dex = [x ** 2 for x in range(10)]
print dex

dex1 = list(map(lambda x:x ** 2,range(10)))
print dex1

dex2 = []
for x in range(10):
    dex2.append(x ** 2)
print dex2

第一个就是使用的列表解析产生的例子。第二个是使用map调用产生列表,第三个是使用for循环产生的列表。
之所以列表解析速度会快,那是因为map和列表解析在解释器中以C语言的速度来运行的,比Python的for循环代码在PVM中步进要快的多。
类表解析中也可以添加判断条件,实例如下:
ifdex = [x ** 2 for x in range(10) if x % 2 == 0]
print ifdex

ifdex1 = list(filter((lambda x:x % 2 == 0),map(lambda x:x ** 2,range(10))))
print ifdex1

ifdex2 = []
for x in range(10):
    if x % 2 == 0:
        ifdex2.append(x ** 2)
print ifdex2

什么是生成器?生成器是为了在需要的时候才产生结果,而不是立即产生结果。这样会节省内存,而不用把所有的记录都加载到内存,并且允许计算时间分散到各个结果请求。
实例如下:
dex3 = []
for x in generator(10):
    dex3.append(x ** 2)
print dex3

生成器的定于如下:

def generator(N):
    for i in range(10):
        yield i

生成器支持迭代器协议,内置next函数,通过dir(x)查看如下:

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'next', 'send', 'throw']

你可能感兴趣的:(Python之道–列表解析和生成器)