chapter3.4解析式、生成器

解析式

列表解析

    eg: new = [(i+1)**2 for i in range(10)]

语法

  [返回值 for 元素 in 可迭代对象 if条件]

  中括号[],内部for循环,if条件语句可选。返回元素是返回的元素,使用print返回的是None。不要使用冒号  ':'

  返回新列表
列表解析式是一种语法糖
  编译器会优化,不影响效率。减少程序员工作量,减少出错。简化代码,可读性增强


构造新列表

[expr for item in iterable if cond1 if cond2]

if 两层是可以使用and代替的

打印20以内的偶数同时也是3的倍数

[i for i in range(1,20) if not i % 2 if i % 3 == 0]

[i for i in range(1,20) if not i % 2 and i % 3 == 0]

  以上两个的效果相同

[(x,y) for x in 'abcde' for y in range(3)]
[[x,y] for x in 'abcde' for y in range(3)]
[{x,y} for x in 'abcde' for y in range(3)]

以上三条都会生成12个元素,注意列表内生成的每一个元素是集合的话,不会互相影响,

for 循环两层可以先判断第一个,再判断第二个

[(i,j)for i in range(7) if i>4 for j in range(16,22) if j>18]
[(i,j)for i in range(7) for j in range(16,22) if i>4 if j>18]

以上两个都可以运行,但将代码块分开可以看出,第一个先判断 i 再循环 j ,第二个先循环两个,再判断,顺序不同

列表解析式可以理解为依次缩进的代码块,一旦有elif,else就不能用

 

生成器表达式

语法

  (返回值 for 元素 in 可迭代对象 if条件)

  列表解析式的括号变成小括号

  返回生成器

generator object

生成器表达式 :按需计算,惰性求值、延迟计算,列表解析式立即返回值

生成器是可迭代对象,但迭代器不一定是生成器,都是可迭代对象
生成器是由生成器表达式形成

生成器

  可迭代对象  iterable
  迭代器  iterator

生成器,不能反复迭代,拨一下转一下,不能求长度len

生成器是可迭代对象,迭代时超界就结束

next() 返回下一个值,到尾部就返回stopIteration,可以试出是否为生成器,next后只能放迭代器

iter(lst)   生成迭代器,将列表转换为迭代器

和列表解析式对比

计算方式  生成器表达式延迟计算,列表解析式立即计算

内存占用  列表占内存,取速度块,返回新列表。  生成器节省空间,如果函数复杂,取较慢,要一个一个来,合起来比较时间相近。

计算速度  从产生时间看,列表速度慢于生成器的速度。生成器没有长度,只是一个对象,生成器不反回值,返回一个对象,

 

集合解析式
{返回值 for 元素 in 可迭代对象 if 条件}

不可放不可hash的元素,立即返回一个集合

 

字典解析式

{返回值 for 元素 in 可迭代对象 if 条件}

使用key:value形式输入

立即返回一个字典

for 的循环 注意  key的值会在相同时,覆盖之前的值value

 

py2引入列表解析式
py2.4引入生成器表达式
py3引入集合,字典解析式,并迁移到2.7

多用解析式,简单,高效
如果解析式太复杂,可以考虑拆解

生成器是可迭代对象,但迭代器不一定是生成器
生成器是由生成器表达式形成

posted on 2018-08-17 15:15  Riper  阅读(167)  评论(0编辑  收藏  举报

导航