Python列表推导式(listcomps)和生…

列表推导式(list comprehension,listcomps)是一个有逻辑代码组成的结构,它构造了一个包含了由那段逻辑代码所生成的值或对象的列表。几个例子:
data = [x +1 for x in range(10)],打印结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

even_numbers = [x for x in range(10) if x % 2 == 0],打印结果:[0, 2, 4, 6, 8]

L = [(x+1,y+1) for x in range(3) for y in range(5)],打印结果:[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5),(3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]

N=[x+10 for x in range(10) if x>5],打印结果:[16, 17, 18, 19]

阅读理解列表推导式的推荐做法是先从里面的for循环开始,向右查看是否有if条件,然后将推导式开始的表达式映射到每一个匹配的元素上去。

生成器表达式(generator expression,genexp)是从Python 2.4开始支持的特性。它和列表推导式的不同点在于,它工作的方式是每次只获取一个元素,而不是一口气处理和构造整个数据结构。这样做的潜在有点是可以节省大量的内存,虽然有时候是要付出一点性能上的代价。生成器表达式的例子:
even_numbers = (x for x in range(10000) if x % 2 == 0),打印结果: at 0x0219F3F0>

L= (i + 1 for i in range(10) if i % 2) 
L1=[] 
for i in L: 
    L1.append(i)
print L1    打印结果:[2, 4, 6, 8, 10]

生成器表达式并不真正创建数字列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。 生成器表达式使用了“惰性计算”(lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用call by need的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated),所以在列表比较长的情况下使用内存上更有效。A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them.

你可能感兴趣的:(Python)