在 Python 中,生成器是一种特殊的迭代器,可以通过函数实现。与常规函数不同的是,生成器在执行时并不会一次性返回所有结果,而是在需要时逐个产生值,并在每次产生值后暂停函数执行状态,直到下一次需要时再继续执行。
Python 中创建生成器有两种方式:
- 使用生成器函数:生成器函数就是一个包含 yield 语句的函数,它会在每次调用 next() 方法时产生下一个值,直到遇到 return 语句或者函数结束。例如:
def generator():
for i in range(5):
yield i
# 使用 for 循环迭代生成器
for value in generator():
print(value)
- 使用生成器表达式:生成器表达式类似于列表推导式,但是使用圆括号 () 而不是方括号 [],并且返回的是一个生成器对象。例如:
generator = (x for x in range(5))
# 使用 for 循环迭代生成器
for value in generator:
print(value)
生成器的优点
生成器有几个优点:
- 节省内存空间:由于生成器不会在一开始就返回所有值,而是在需要时才生成一个值,因此它可以避免预先占用太多内存空间。
- 惰性计算:生成器只有在需要时才会计算下一个值,因此可以在处理大量数据时提高计算效率。
- 可以无限生成:由于生成器使用了 yield 语句来产生值,并没有像列表一样固定的长度,因此可以无限生成数据。
需要注意的是,一旦一个生成器函数返回,它就不能再次使用。如果想要重新迭代生成器,可以重新调用生成器函数来获取新的生成器对象。
练习代码
def foo():
print("开始...")
while True:
# yield 相当于 中途return,后面的代码还能执行
# yield 4 后,不会赋值给res,res的值为None
# 可以使用 send(num),传值进来给res
res = yield 4
print("结果:",res)
def test1():
g = foo()
print(next(g))
print("*"*20)
print(next(g))
print("*"*20)
print(next(g))
def foo(num,end):
print("开始...")
while num<end:
num=num+1
yield num
# 使用for可以遍历生成器从开始到结束
def test2():
for n in foo(0,100):
print(n)
# 离谱写法,生成器结束后还要next的话,会报StopIteration错误
def test3():
r = foo(0,10)
while True:
try:
print(next(r))
except StopIteration:
print('结束了')
break
if __name__=='__main__':
test3()