语法
(返回值 for元素 in可迭代对象 if条件)
返回一个生成器
和列表解析式的区别
生成器表达式是按需计算(称惰性求值、延迟计算),需要的时候才计算值
列表解析式是立即返回值
生成器
可迭代对象(可迭代对象未必是迭代器,但是迭代器一定是可迭代对象)
迭代器
只有迭代器可以用next,用iter可以将一个可迭代对象转换成迭代器
a = (i for i in range(10))
next(a)
1
--------------------------------------------
next(range(1,3))
'range' object is not an iterator
生成器表达式
举例:
g=("{:04}".format(i)for i in range(1,11))
next(g)
for x in g:
print(x)
print('~~~~~~~~')
for x in g:
print(x)
0002
0003
0004
0005
0006
0007
0008
0009
延迟计算
返回迭代器,可以迭代
从前到后走完一遍后,不能回头
对比列表:
举例:
g=["{:04}".format(i)for i in range(1,11)]
for x in g:
print(x)
print('~~~~~~~~')
for x in g:
print(x)
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
~~~~~~~~
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
立即计算
返回的不是迭代器,返回可迭代对象列表
从前到后走完一遍后,可以重新回头迭代
计算方式
生成器表达式延迟计算,列表解析式立即计算
内存占用
单从返回值本身来说,乘乘其表达式省内存,列表解析式返回新的列表
生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是合起来占用的内存也差不多
列表解析式构造新的列表需要占用内存
计算速度
单看计算时间看,生成器表达式耗时非常短,列表解析式耗时长
但是生成器本身并没有返回任何值,只返回了一个生成器对象
列表解析式构造并返回一个新的列表
语法
{返回值for元素in可迭代对象if条件}
列表解析式的中括号换成大括号{}就行了
立即返回一个集合
用法
{(x,x+1)for x in range(10)}
{[x]for x in range(10)} #报错,因为[]是列表,{}而这个是集合,里面不能出现不可以哈希的元素
语法
{返回值for元素in可迭代对象if条件}
列表解析式的中括号换成大括号{}就行了
使用key:value形式
立即返回一个字典
用法
{
x:(x+1) for x in range(10)}
{
0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
{
x:[x,x+1] for x in range(10)}
{
0: [0, 1],
1: [1, 2],
2: [2, 3],
3: [3, 4],
4: [4, 5],
5: [5, 6],
6: [6, 7],
7: [7, 8],
8: [8, 9],
9: [9, 10]}
{
(x,):[x,x+1] for x in range(10)}
{
(0,): [0, 1],
(1,): [1, 2],
(2,): [2, 3],
(3,): [3, 4],
(4,): [4, 5],
(5,): [5, 6],
(6,): [6, 7],
(7,): [7, 8],
(8,): [8, 9],
(9,): [9, 10]}
{
[x]:[x,x+1] for x in range(10)}#
{
chr(0x41+x):x**2 for x in range(10)}
{
'A': 0,
'B': 1,
'C': 4,
'D': 9,
'E': 16,
'F': 25,
'G': 36,
'H': 49,
'I': 64,
'J': 81}
{
str(x):y for x in range(3) for y in range(4)}#输出多少个元素?
{
'0': 3, '1': 3, '2': 3}
字典起到去重作用
用法
{str(x):y for x in range(3) for y in range(4)}
等价于
ret={}
for x in range(3):
for y in range(4):
ret[str(x)]=y
python2引入列表解析式
python2.4引入生成器表达式
python3引入集合、字典解析式,并迁移到了2.7