python 生成器表达式

() 小括号用来生成 生成器
把列表推导式的 [] 换成 () 就是生成器表达式

1
2
3
4
5
g = (i for i in range(10))
print(g)


<generator object <genexpr> at 0x000001719E5E3EB8>

用生成器表达式,可以用来造一个无限个值的数据

1
2
3
4
5
6
7
8
9
10
11
g = (i for i in range(10))
print(next(g))
print(next(g))
print(next(g))
print(next(g))


0
1
2
3

生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
chicken = ('鸡蛋%s' % i for i in range(5))
print(chicken)

<generator object <genexpr> at 0x10143f200>

#############################################################################################
chicken = ('鸡蛋%s' % i for i in range(10))
print(next(chicken))
print(next(chicken))
print(next(chicken))
print(next(chicken))

鸡蛋0
鸡蛋1
鸡蛋2
鸡蛋3

#############################################################################################
chicken = ('鸡蛋%s' % i for i in range(5))
print(list(chicken)) # 因 chicken 可迭代,因而可以转成列表
['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4']

优点:省内存,一次只产生一个值在内存中

1
2
3
4
5
6
7
8
9
10
11
chicken = ('egg%s' % for i in range(3))
print(next(chicken))
print(next(chicken))
print(next(chicken))
print(next(chicken))


egg0
egg1
egg2
StopIteration

小练习

求文件 a.txt 中最长的行的长度(长度按字符个数算,需要使用 max 函数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 获取文件内每一行的字符长度
with open('a.txt', 'r', encoding='utf-8') as f:
nums = [len(line) for line in f]
print(nums)


[2, 3, 4, 5, 66, 54, 54, 54, 54, 53]

#############################################################################################
# 获取最长那一行的长度
with open('a.txt', 'r', encoding='utf-8') as f:
nums = [len(line) for line in f] # 这里用列表生成器会有问题,如果文件内容非常多,这个列表会变得非常大,我们可以换成生成器表达式
print(max(nums))


66

#############################################################################################
# 获取最长那一行的长度
with open('a.txt', 'r', encoding='utf-8') as f:
nums = (len(line) for line in f)
print(nums)


<generator object <genexpr> at 0x00000153AFF855C8>

#############################################################################################
with open('a.txt', 'r', encoding='utf-8') as f:
nums = (len(line) for line in f)
print(max(nums))


66