目录
生成器与生成器表达式
Python生成器的理解
Python生成器(generator)可以理解成内存中保存的一个数学公式(算法),这个公式可以生成一系列数据,每次调用时只能取出其中一个数据。这样做的好处是节省了内存(不有保存所有数据,而只需要保存生成数据的公式即可)。即Python生成器保存的是算法,而不是算法计算出来的数据。
生成器(的结果)是一种迭代器(见后面迭代器讲解),拥有next方法,可以用于for循环。
要创建一个生成器,有很2种方法。
- 生成器函数
- 生成器表达式
Python生成器函数
如果一个函数内部出现了yield这个关键字,那么该函数就是一个生成器函数,调用生成器函数将得到一个生成器。
def genfun(n):
i = 0
while i < n:
yield i
i += 1
generate = genfun(5)
print(type(generate))
for item in generate:
print(item)
运行结果
<class 'generator'>
0
1
2
3
4
Process finished with exit code 0
yield相当于return,就是返回结果
def genfun():
yield(1)
yield(2)
yield(3)
generate = genfun()
print(type(generate))
for item in generate:
print(item)
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
<class 'generator'>
1
2
3
Process finished with exit code 0
Python生成器表达式
Python生成器表达式与列表推导式很像,格式上把中括号换成小括号即可。
(返回值 for 元素 in 可迭代对象 if 条件)
返回一个生成器,生成器也是一个对象,属于中间值。
gen1=(x for x in range(10))
print(gen1) # <generator object <genexpr> at 0x0000021A8BFEC748>
print(next(gen1)) # 0
print(next(gen1)) # 1
print(next(gen1)) # 2
print(next(gen1)) # 3
gen2=(x*x for x in range(10))
print(gen2) # <generator object <genexpr> at 0x0000021A8C00F148>
gen3=(x*x for x in range(10) if x % 2==0)
print(gen3) # <generator object <genexpr> at 0x0000021A8C00F248>
生成器对象的取值只能一次一次取值。
next() 函数是Python内置函数,返回迭代器的下一个项目。
生成器可以通过迭代(循环)取值。
gen1=(x for x in range(10))
for item in gen1:
print(item)
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
0
1
2
3
4
5
6
7
8
9
Process finished with exit code 0