列表解析(List comprehensions,或者缩略为list comps)来自函数式编程语言Haskell,可以用来动态创建列表。

[expr for iter_var in iterable]

这个语法的核心是for 循环,他迭代iterable对象的所有条目,表达式expr应用于序列的每个成员,最后的结果值是该表达式产生的列表。

print map(lambda x:x ** 2,range(6))
print [x ** 2 for x in range(6)]            #使用列表解析

列表解析中,只有一次函数调用(调用range()函数),而第一条语句中有三次函数调用(range(),map(),lambda),也可以将x**2括起来,这样更便于阅读[(x**2) for x in range(6)],列表解析可以取代内建的map()和lambda函数,而且效率更高。结合if语句,列表解析还提供了一个扩展的语法形式。

[expr for iter_var in iterable if cond_expr ]
seq = [11,10,9,9,10,10,9,8,23,9,7,18,12,11,12]
print filter(lambda x:x%2,seq)
print [x for x in seq if x % 2]

还比如迭代一个矩阵

print [(x+1,y+1) for x in range(3) for y in range(5)]

生成器表达式是列表解析的一个扩展,列表解析的一个重要不足之处在于要生成所有的数据,用于创建整个列表,这可能对于有大量数据的迭代器有负面效应,而生成器是特定的函数,允许返回一个值,然后“暂停”代码的执行,稍后回复。生成器表达式通过结合列表解析和生成器解决了整个问题。其语法和列表解析非常相似,而且他们的基本语法基本相同,不过生成器表达式并不真正的创建数字列表,而是返回一个生成器,整个生成器在每次计算出一个条目后,把这个条目“产生”出来,生成器表达式使用了“延迟计算”,所以在使用内存上更高效。

(expr for iter_var in iterable if cond_expr )

生成器并不会让列表解析废弃,它只是一个内存使用更友好的结构,基于此,很多使用生成器的地方

例如计算文件中的非空字符总和。

f = open('test.txt','r')
print len([word for line in f for word in line.split()])
print sum(len(word) for line in f for word in line.split())

为了避免创建庞大的列表,可以使用生成器表达式来完成对非空格字符的求解

这里寻找一个文件最长的行的例子来看看如何改进代码

f = open('/etc/motd','r')
longest = 0
while true:linelength = len(f.readline().strip())    #strip()函数是移除字符串首尾的空字符if not linelength:breakif linelength > longest:longest = linelengthf.close()
return longest

在上面的例子中,从读取文件开始一直查找到最长的行,一直占用着文件资源,那如果这是一个很多进程都需要访问的日志文件,这样理所当然的就不能一直占用文件的句柄不释放,因此作出如下改动。

f = open('/etc/motd','r')
longest = 0
allLines = f.readlines()
f.close()
for line in allLines:linlen = len(line.strip())if linlen > longest:longest = linlen
return longest

列表解析允许稍微简化代码,而且可以再得到行的集合之前做一定的处理

f = open('/etc/motd','r')
longest = 0
allLines = [x.strip() for x in f.readlines()]
f.close()
for line in allLines:linlen = len(line)if linlen > longest:longest = linlen
return longest

然而两个例子中在处理大文件时候都有问题,因为readlines()函数会读取文件的所有行,在有了迭代器之后,文件本事就成为自己的迭代器,不需要调用readlines()函数,这样

f = open('/etc/motd','r')
allLineLen = [len(x.strip()) for x in f]
f.close()
return max(allLineLen)

这里的问题就是一行一行迭代f的时候,列表解析需要文件的所有行读取到内存中,然后生成列表,这里可以进一步简化代码:使用生成器表达式替换列表解析,然后把它移动大max()函数中

f = open('/etc/motd','r')
longest = max(len(x.strip()) for x in f)
f.close()
return longest

最后可以去掉文件的打开模式(默认为读取),然后让python去处理打开的文件。当然文件用于写入的时候不能这么做。

return max(len(x.strip()) for x in open('etc/moth'))

列表解析和生成器表达式相关推荐

  1. python天天向上代码解析-python列表解析和生成器表达式

    列表解析在需要改变列表而不是需要新建某列表时,可以使用列表解析.列表解析表达式为: [expr for iter_var in iterable] [expr for iter_var in iter ...

  2. Python基础-----三元表达式、列表解析、生成器表达式

    三元表达式: 变量 = 值1 if 条件为真 else 值2 类似于: res = '对了' if 1 > 2 else '错了' print(res) >>> '错了' 普通 ...

  3. 三元表达式,列表解析和生成器表达式

    三元表达式 在以前,在诸如比较两个数大小的时候,通常的写法都是下面的样子 if x > y:print("the max is x") else:print("th ...

  4. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  5. python列表解析,生成表达式(一分钟读懂)

    如果想通过操作和处理一个序列来创建一个新的列表时,可以使用列表解析和生成表达式 区分就是 [ ] ( ) 1.列表解析 list comprehensions 2.生成表达式 a = [ i for ...

  6. python关键字列表的表达式,python 列表推导和生成器表达式的使用

    序列 序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不可变序列与可变序列. 容器序列与扁平序列 容器序列存放的是对象的引用,包括list.tuple.collections.de ...

  7. Python 列表推导 、生成器表达式与声明式编程

    1.****列表推导********* 用到函数的一个常见的操作是将其用于列表的所有项,并使用结果创建一个新的列表.例如: # coding=utf-8 ''' ****列表推导********* 用 ...

  8. mysql数据字典生成器_「python技术」列表推导、生成器表达式和字典推导的差异及其示例

    #开往春天新创作大赛# 前言 列表推导式构建列表的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列.自python2.7以后,列表推导和生成器表达式的概念就应用到了字典上,所以就有了字典推导, ...

  9. 列表推导和生成器表达式

    1 概念解释 列表推导是构建列表的快捷方式,生成器表达式可以用来创建其他任何类型的序列. 列表推导:放在方括号里的表达式,使用关键字for与in,通过处理和过滤一个或多个可迭代对象里的元素构建列表. ...

最新文章

  1. 七、linux驱动注册
  2. Shell教程(五):替代、引用机制、输入输出重定向
  3. 开榨油店的失败教训_想开水果店没有经验?线下开水果店经营心得分享,或许你用得上...
  4. day1作业二:多级菜单操作
  5. Mybatis/Ibatis,数据库操作的返回值
  6. iOS开发多线程-RunLoop
  7. Observe rainy world
  8. python 近期用到的基础知识汇总(六)
  9. [置顶] 根据 子网掩码 算出 最大主机数目
  10. mysql实现用拼音搜索中文的数据库实现
  11. ie支持html5代码,使用 HTML5 Shiv 让 IE 支持 HTML5
  12. 现代数字图像处理技术提高及应用案例详解
  13. C++ 取模、求余运算
  14. 程序员面试HR常问问题(含答案)
  15. Reinforced Neighborhood Selection Guided Multi-Relational Graph Neural Networks阅读笔记
  16. html字体标签设计,36个重要的HTML标签
  17. RabbitMQ与Erlang版本对应关系
  18. CMMI2.0之我见-配置管理CM
  19. 在Windows中安装一些python的第三方库
  20. 7行代码制作一个超声波测距仪

热门文章

  1. 网络编程-计算机网络
  2. java应用的优化【转】
  3. Python小游戏之 - 飞机大战 !
  4. 小功能 获取一段汉字的拼音首字母
  5. SUMO 在LINUX 下安装以及环境变量的配置
  6. ST17H26 tea加密java版本
  7. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断
  8. (chap1 网络基础知识)协议分层与OSI参考模型
  9. [mmu/cache]-ARMV8的cache的维护指令介绍
  10. Fabric--启动网络自动