本章内容含有 列表解析和 生成表达式
在看下面的之前 我先说下 python的 核心 价值观、
◇优雅
◇清晰
◇务实
这样会让你更好理解下面要说的内容。
◆列表解析:如果想通过操作和处理一个序列来创建一个新的列表时,可以使用列表解析和生成表达式。当我们 对一个序列 进行一种 处理的时候,最终还要 用到一个列表,这个时候就会用到列表表达式。
◆生成表达式:有时简单的生成器可以用简洁的方式调用,就像不带中括号的链表推导式。这些表达式是为函数调用生成器而设计的。生成器表达式比完整的生成器定义更简洁,但是没有那么多变,而且通常比等价的链表推导式更容易记。官方手册9.10 位置
1. 列表解析
列表解析的定义(List comprehensions)
我们从一道 数学题来开启此次思路
⒈ 如果我们列出小于10,并且是3或5的倍数的所有自然数,
它们是3、5、6、9,计算它们的和是3+5+6+9=23。
⒉ 现找出小于1000并且是3或5的倍数的所有自然数计算出
它们的和。
普通解决方案1
运算结果
运行看起来没什么问题-下面介绍下列表解析,你就会发现新世界的大门哦~
补充知识点sum函数,给它一个列表 就可以自动求和。
列表解析表达式为:
[expr for iter_var in iterable]
表达式 for循环 -迭代从后的序列当中 -进行迭代,-取到的值 -进行前面的运算
▲举个例子
效果很明显 先从后面遍历取值,*以前面的值。生成新的列表。
[expr for iter_var in iterable]
序列当中for循环 -进行迭代变量 -进行判断 -满足这个条件 -在到前面进行运算
▲举个例子
发现没有 i取值后 必须先执行 if 判断 小于5,才会执行到前面的运算。所以小于5的会执行运算*10。
列表解析 --方案2
这就是用列表解析 生成一个效果.是不是比普通写起来更加 优雅 ~~通过一行代码解决了问题。
小提示:当我们 对一个序列 进行一种 处理的时候,最终还要 用到一个列表,这个时候就会用到列表 表达式,其它环境下用不到。
看起来代码少了一点,下面我们探究下 效率高不高
我运行了以上代码,后面计算1亿里面取值时,顿挫感很强。注意第一行的程序,当执行1-10的送代时候,会返回一个列表。当1个亿的时候,在它求和之前,会把列表全部列出来,进行求模元素,满足这个条件,就会生成一共大列表。在内存当中就会生成一段时间,会影响运算速度,占用内存空间。
现在有了有列表解析了,代码简介了,可是它的效力并不高,产生这么多无用的列表。
我不打印 ,也会在内存中产生,占用大量内存空间。
所以这个时候就要伦到二号角色上场了。
2.生成器表达式
(expr for iter_var in iterable)
(expr for iter_var in iterable if cond_expr)
从形式上来看 ,和列表解析唯一的区别就是把列表的方括号 变成了元组的圆括号
▲举个生成器例子
只需要改括号就可以
Po一张 邹老师的课程的图 生成器表达器的解释和特点
这里面有个概念是 生成器是为 惰性运算,这个翻译会成不同意思,这里我们就叫做生成器表达式。
在列表比较长的情况下,我们都会用生成器表达式,会有效的节省内存空间。
▲案例 1
生成的是 生成器 对象返回不是值
显著特点 当有人 向它 索取值的时候,它才会把这个值产生出来,所以称之为 惰性计算
返回的不是值,它就是一个生成器对象。
▲案例 2
当有方法 用到值的的时候,才会用到。和列表解析的最大区别,不会上来生成大量列表
生成器表达式 概念 = 惰性计算
惰性计算 不会无故一下生产 3-5-6-9这几个值,而是会变成一个整体对象。
---generator-生成器 - expression-表达式
有人取值了 取 3 给3 -取 5 给5 -取6给6-取9给9。在取就没有了.在列表比较长的时候会用到生成器表达式,有效节省内存空间。内存上更加优越!
知道了列表解析 和生成表达式的时候,会觉得很方便,很便捷,但是不建议一直用!
下面po一张邹老师的建议
可能你获得是别人二次处理的知识,你也可以去官网查官方手册。
本章获得知识点:
列表解析的使用,和含义
生成表达式的使用,和含义
希望我理解能对你有帮助。
2017年12月15日 王宇林
本文转自
新网学会 51CTO博客,原文链接:http://blog.51cto.com/xwxhvip/2051217 ,如需转载请自行联系原作者