Python 生成器
生成器
生成器是可以暂停和恢复执行的函数。
调用生成器函数时,它会返回一个生成器对象,也就是一个迭代器。
函数内部的代码尚未执行,仅被编译。只有当你遍历生成器时,函数才会执行。
实例
一个简单的生成器函数:
def my_generator():
yield 1
yield 2
yield 3
for value in my_generator():
print(value)
亲自试一试 »
生成器允许你遍历数据,而无需将整个数据集存储在内存中。
生成器不使用 return,而是使用 yield 关键字。
yield 关键字
yield 关键字使函数成为生成器。
当遇到 yield 关键字时,函数的状态会被保存,并返回该值。下次调用生成器时,它会从上次中断的地方继续执行。
实例
生成数字的生成器:
def count_up_to(n):
count = 1
while count <= n:
yield count
count += 1
for num in count_up_to(5):
print(num)
亲自试一试 »
与会终止函数的 return 不同,yield 会暂停函数,并且可以多次调用。
生成器节省内存
生成器之所以节省内存,是因为它们可以动态生成值,而不是将所有数据都存储在内存中。
对于大型数据集,生成器可以节省内存:
实例
大型序列生成器:
def large_sequence(n):
for i in range(n):
yield i
# 这不会在内存中创建一百万个数字
gen = large_sequence(1000000)
print(next(gen))
print(next(gen))
print(next(gen))
亲自试一试 »
使用 next() 函数处理生成器
您可以使用 next() 函数手动遍历生成器:
实例
def simple_gen():
yield "Emil"
yield "Tobias"
yield "Linus"
gen = simple_gen()
print(next(gen))
print(next(gen))
print(next(gen))
亲自试一试 »
当没有更多值可供生成时,生成器会引发一个StopIteration异常:
实例
def simple_gen():
yield 1
yield 2
gen = simple_gen()
print(next(gen))
print(next(gen))
print(next(gen)) # 这将引发 StopIteration 异常
亲自试一试 »
生成器表达式
类似于列表推导式,您可以使用圆括号而不是方括号来创建生成器:
实例
列表推导式与生成器表达式:
# 列表推导式 - 创建一个列表
list_comp = [x * x for x in range(5)]
print(list_comp)
# 生成器表达式 - 创建一个生成器
gen_exp = (x * x for x in range(5))
print(gen_exp)
print(list(gen_exp))
亲自试一试 »
斐波那契数列生成器
生成器可以用来生成斐波那契数列。
它可以无限期地生成数值,而不会耗尽内存:
实例
生成 100 个斐波那契数:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
获取前100个斐波那契数列数字
gen = fibonacci()
for _ in range(100):
print(next(gen))
亲自试一试 »
生成器方法
生成器具有用于高级控制的特殊方法:
send() 方法
send() 方法允许您向生成器发送一个值:
实例
def echo_generator():
while True:
received = yield
print("Received:", received)
gen = echo_generator()
next(gen) # Prime the generator
gen.send("Hello")
gen.send("World")
亲自试一试 »
close() 方法
close() 方法会停止生成器:
实例
def my_gen():
try:
yield 1
yield 2
yield 3
finally:
print("Generator closed")
gen = my_gen()
print(next(gen))
gen.close()
亲自试一试 »

