列表解析式和生成式
列表解析List Comprehension
语法
返回值 + for + 元素 + in +可迭代对象 + (可+if 条件 )
当返回值被print()接收之后,print()没有返回值,所以被print()后,只能返回Neno,没有返回值
list1 = [ i for i in range(10) ]
最外层使用中括号[],这是列表解析式,内部是for循环,if条件语句可选
返回一个新的列表
列表解析式是一种语法糖
编译器自行优化,不会因简写而降低效率;反而是优化过后更加高效
减少程序员的工作量,减少出错;简化了代码,使得可读性增强
例子:获取是20以内的偶数,且能被3整除
lst = [ i for i in range(20) if i%2==0 and i%3==0]
lst = [ i for i in range(30) if i%2==0 or i%3==0] 在里面不能写 elif else 只能用 or
lst = [ i for i in range(20) if i%2==0 if i%3==0]
lst = [ (i,j) for i in range(7) if > 4 for j in range(20,25) if > 22] 效率较高
[(x,y) for x in "abcdefgh" for y in range(3)]
[[x,y] for x in "abcdefgh" for y in range(3)]
[{x,y} for x in "abcdefgh" for y in range(3)]
生成器表达式Generator expression
语法
返回值 + for + 元素 + in +可迭代对象 if 条件
列表解析式的中括号换成小括号了
返回一个生成器
和列表解析式的区别
生成器表达式是按需计算(或称 惰性求职、延迟计算)
列表解析式是理解返回值
生成器
可迭代对象
迭代器
总结
生成器 列表
延迟计算 立即计算
返回迭代器,可以迭代 返回的不是迭代器,但返回的是可迭代对象列表
从前走到尾,不能回头再走一次 从前走到尾,可以重新回头迭代
对比
计算方式:
生成器表达式 延迟计算
列表解析式 立即计算
内存占用
单从返回值本身来说,生成器表达式节约内存;列表解析式返回新的列表
生成器没有数据,占内存极少,但是使用时,虽然是一个个的返回数据,但合起来占用的内存也差不多
列表解析式构造新的列表需要占用内存
计算速度
单看计算时间,生成器表达式耗时非常短,列表解析式耗时较长
但是生成器本身没有返回任何值,值返回了一个生成器对象
列表解析式构造并返回一个新的列表
集合解析式
语法
{返回值 + for+ 元素 + in+ 可迭代对象 if 条件}
列表解析式中的括号改为{}即可
立即返回一个集合
元素中不能出现不可hash类型,不可hash 的一般是可变类型数据
字典解析式
{返回值 + for + 元素 + in + 可迭代对象 if 条件}
列表解析式的中括号换成{}
使用key:value形式
立即返回一个字典
生成器和迭代器是不同的对象,但都是可迭代对象
转载于:https://blog.51cto.com/12951676/2175867