列表解析 List Comprehension
举例
生成一个列表,元素0-9,对每一个参数自增1后求平方返回新列表 l1 = list(range(10)) l2 = [] for i in l1: l2.append((i+1)**2) print(l2) - 列表解析式 l1 = list(range(10)) l2 = [(i+1)**2 for in l1] print(l2) print(type(l2))
语法
[返回值 for 元素 in 可迭代对象 if 条件]
- 使用中括号 [], 内部是for循环,if条件语句可选
- 返回一个新的列表
列表解析式是一种语法糖
编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
减少工作量,减少出错(可能吧)
简化了代码,单可读性增强(可能吧)
生成器表达式Generator expression
语法
(返回值 for 元素 in 可迭代对象 if 条件)
- 列表解析式的中括号换成小括号就行了
- 返回一个生成器
和列表解析式的区别
生成器表达式是按需计算(或称为惰性求值,延迟计算),需要的时候才计算值
列表解析式是立即返回值
生成器
可迭代对象
迭代器
生成器表达式
- 举例
g = ("{:04}".format(i) for i in range(1,11))
nest(g)
for x in g:
print(x)
print("______")
for x in g:
print(x)
总结
- 延迟计算
- 返回迭代器,可以迭代
- 从前到后走完一遍后,不能回头
和列表解析式的对比
- 计算方式
- 生成器表达式延迟计算,列表解析式立即计算
- 内存占用
- 单从返回值本身来说,生成器表达式省内存,列表解析式返回新的列表
- 生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是合起来占用的内存也差不多
- 列表解析式构造新的列表需要占用内存
- 计算速度
- 单看计算时间,生成器表达式耗时非常短,列表解析式耗时长
- 但是生成器本身并没有返回任何值,至返回了一个生成器对象
- 列表解析式构造并返回一个新的列表
集合解析式
语法
{返回值 for 元素 in 可迭代对象 if 条件}
- 列表解析式的中括号换成大括号{} 就行了
- 立即返回一个集合
用法
{(x, x+1) for x in range(10)}
{[x] for x in range(10)} #错误,注意集合特性
字典解析式
语法
{返回值 for 元素 in 可迭代对象 if 条件}
- 列表解析式的中括号换成大括号{}就行了
- 使用key.value形式
- 立即返回一个字典
用法
{x:(x,x+1) for x in range(10)}
{x:[x,x+1] for x in range(10)}
{(x,):[x,x+1] for x in range(10)}
{[x]:[x,x+1] for x in rnage(10)} #错误,注意字典特性
{chr(0x41 + x ):x**2 for x in range(10)}
{str(x):y for x in range(3) for y in range(4)}