如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression)

(1)list comprehension

[expr for iter_var in iterable ] or [expr for iter_ in iterable if cond_expr]

l1=[1,2,3,4,5]

[x+1 for x in l1]

[2, 3, 4, 5, 6]

[x-1 for x in l1 if x>3]

[3, 4]

dict([(x,x+1) for x in l1])

{1: 2, 2: 3, 3: 4, 4: 5, 5: 6}

vec1=[1,2,3]
vec2=[6,7,8]
sq=[vec1[i]+vec2[i] for i in range(len(vec1))]
print sq [7, 9, 11] [x*y for x in [1,2,3] for y in [3,4,5]] [3, 4, 5, 6, 8, 10, 9, 12, 15] [(x+y) for x in l1 for y in range(x)] [1, 2, 3, 3, 4, 5, 4, 5, 6, 7, 5, 6, 7, 8, 9] def t_f(x):
return x+1 [t_f(i) for i in l1] [1, 2, 3, 4, 5] 等价于 map(t_f,l1)

(2)generator expression

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以应当考虑使用生成器表达式而不是列表解析.生成器表达式并不真正创建数字列表, 而是返回一个生成器generator,generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。但是我们一般通过for循环来迭代它,并且不需要关心StopIteration的错误。

for n in g:
print(n)

由于这个生成器在每次计算出一个条目后,把这个条目“产生”(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.

(expr for iter_var in iterable) or (expr for iter_var in interable if cond_expr)

ge1=(x+1 for x in l1 if x%2)
ge1 <generator object <genexpr> at 0x000000000959EA68> type(ge1) generator for i in ge1:
print i [1, 2, 3, 4, 5]

some adds:

1)当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性

2)当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析

good:
l2=l1 bad:
l2=[x for x in l1]

3)如果需要对每个元素都调用并且返回结果时,应使用L1=map(f,L), 而不是 L1=[f(x) for x in L]

最新文章

  1. 10个惊艳的Swift单行代码
  2. 在AngularJS中同一个页面配置一个或者多个ng-app
  3. JavaWeb开发学习(一)-JavaWeb开发概述
  4. python排序算法的实现-插入
  5. Android 开发 --Unable to resolve target &#39;android-19&#39;
  6. 性能测试-Jmeter
  7. Loongnix 系统(MIPS Linux)
  8. sqlserver授予用户查看执行计划的权限
  9. history对象属性和方法
  10. Lucene.Net 2.3.1开发介绍 —— 三、索引(一)
  11. Unity5系列资源管理AssetBundle——更新实现
  12. easyui-datagrid加载时的效率低下,解决方案
  13. 增强 Sublimetext3
  14. MySQL之索引详解
  15. java基础-学java util类库总结
  16. ELF文件解析(二):ELF header详解
  17. Redis实战 内存淘汰机制
  18. AJPFX:什么是止盈?什么是止损?
  19. Mybatis知识(3)
  20. URL转义字符

热门文章

  1. Nginx:访问第三方服务
  2. UnrealEngine4 尝鲜
  3. 【转】mongoDB命令行和客户端访问
  4. mysql 主从切换
  5. flume-ng tmp
  6. ORACLE 表空间使用率查询
  7. Java研发工程师面试题
  8. AliRedis性能
  9. 自学宝典:10个学习Android开发的网站推荐
  10. python 基础 9.9 查询数据