解析式
列表解析
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
多用解析式,简单,高效
如果解析式太复杂,可以考虑拆解
生成器是可迭代对象,但迭代器不一定是生成器
生成器是由生成器表达式形成