9.解析式与生成器
2020-12-15 本文已影响0人
Stone_説
目录
1.列表解析
2.生成器表达式
3.集合解析式
4.字典解析式
1. 列表解析介绍
1.1 列表解析介绍
语法:
[返回值 for 元素 in 可迭代对象 if 条件]
使用中括号[],内部是for循环,if条件语句可选
返回一个新列表
>>> even = []
>>> for x in range(10):
... if x % 2 == 0:
... even.append(x)
>>> print(even)
[0, 2, 4, 6, 8]
列表解析方法:
>>> even2 = [x for x in range(10) if x % 2 == 0]
>>> print(even2)
[0, 2, 4, 6, 8]
1.2 列表解析进阶
[expr for item in iterable if cond1 if cond2]
等价于
ret = []
for item in iterable:
if cond1:
if cond2:
ret.append(expr)
例1:20以内,既能被2整除又能被3整除的数
>>> [i for i in range(20) if i%2 == 0 and i%3 == 0]
[0, 6, 12, 18]
>>> [i for i in range(20) if i%2 == 0 if i%3 == 0]
[0, 6, 12, 18]
[expr for i in iterable1 for j in iterable2]
等价于
ret = []
for i in iterable1:
for j in iterable2:
ret.append(expr)
例2:
>>> [(x,y) for x in 'abcde' for y in range(2)]
[('a', 0), ('a', 1), ('b', 0), ('b', 1), ('c', 0), ('c', 1), ('d', 0), ('d', 1), ('e', 0), ('e', 1)]
>>> [[x,y] for x in 'abcde' for y in range(2)]
[['a', 0], ['a', 1], ['b', 0], ['b', 1], ['c', 0], ['c', 1], ['d', 0], ['d', 1], ['e', 0], ['e', 1]]
>>> [{x,y} for x in 'abcde' for y in range(2)]
[{0, 'a'}, {'a', 1}, {0, 'b'}, {1, 'b'}, {0, 'c'}, {1, 'c'}, {'d', 0}, {'d', 1}, {0, 'e'}, {'e', 1}]
2.生成器表达式
2.1 介绍
语法介绍:
(返回值 for 元素 in 可迭代对象 if 条件)
列表解析式的中括号换成小括号即可,返回一个生成器
列表解析的区别:
生成器表达式是按需计算(或称惰性求值,延迟计算),需要的时候才计算值列,表解析式是立即返回值
可迭代对象和迭代器均属于生成器
例1:
>>> g = ["{:04}".format(i) for i in range(1,5)]
>>> g
['0001', '0002', '0003', '0004']
>>> for x in g :
... print(x)
0001
0002
0003
0004
>>> for x in g:
... print(x)
0001
0002
0003
0004
使用生成器:
>>> g = ("{:04}".format(i) for i in range(1,5))
>>> g
<generator object <genexpr> at 0x7f1054aa3c80>
>>> next(g)
'0001'
>>> for x in g:
... print(x)
0002
0003
0004
>>> for x in g:
... print(x)
总结
生成器: 列表
1.延迟计算 立即计算
2.返回迭代器,可以迭代 返回的不是迭代器,返回可迭代对象列表
3.从前到后走完一遍,数据只能使用一次 数据可反复,多次使用
3.集合解析式
3.1 语法介绍
{返回值 for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
立即返回一个集合
3.2 举例
>>> {(x,x+1) for x in range(3)}
{(0, 1), (1, 2), (2, 3)}
>>> {x for x in range(3)}
{0, 1, 2}
>>> {[x] for x in range(3)}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <setcomp>
TypeError: unhashable type: 'list'
4.字典解析式
4.1 语法介绍
{返回值 for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
使用key:value形式
立即返回一个字典
4.2 举例
>>> {x:x+1 for x in range(3)}
{0: 1, 1: 2, 2: 3}
>>> {x:[x,x+1] for x in range(3)}
{0: [0, 1], 1: [1, 2], 2: [2, 3]}
>>> {(x,):[x,x+1] for x in range(3)}
{(0,): [0, 1], (1,): [1, 2], (2,): [2, 3]}
>>> {chr(0x41+x):x**2 for x in range(3)}
{'A': 0, 'B': 1, 'C': 4}
>>> {str(x):y for x in range(3) for y in range(4)}
{'0': 3, '1': 3, '2': 3}
>>> {[x]:[x,x+1] for x in range(3)}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
TypeError: unhashable type: 'list'