Python中的生成器(Generators)是一种特殊的迭代器,它们允许你逐个生成元素,而不是一次性生成一个完整的列表或集合。这样做的好处是节省内存,因为生成器只会在需要时生成下一个值,而不是在开始前就创建所有值。
生成器的创建
生成器可以通过两种方式创建:
使用生成器表达式:类似于列表推导式,但使用圆括号而不是方括号。
使用函数定义中的yield语句:在函数中,使用yield语句而不是return语句,可以使函数成为一个生成器。
使用yield语句的生成器
使用yield语句定义的生成器函数会在每次迭代时返回下一个值,并保存函数的状态,以便在下一次迭代时从上次停止的地方继续执行。
def count_to_n(n): for i in range(n): yield i # 使用生成器 for number in count_to_n(5): print(number)
生成器表达式
生成器表达式提供了一种更简洁的方式来创建生成器,它看起来像是列表推导式,但使用圆括号。
# 生成器表达式 squares = (x*x for x in range(5)) # 使用生成器表达式 for square in squares: print(square)
发送值到生成器
生成器还支持send()方法,该方法允许你向生成器发送一个值,该值将在yield表达式中被接收。这可以用于生成器之间的通信或基于输入动态生成值。
def counter(): count = 0 while True: value = yield count if value is not None: print(f"Received: {value}") count += 1 c = counter() next(c) # 初始化生成器 print(c.send(10)) # 发送值10到生成器,并获取下一个yield的值
注意:在第一次使用send()之前,必须先使用next()或send(None)来启动生成器。
关闭生成器
使用close()方法可以关闭生成器,这可以防止进一步迭代并释放生成器使用的资源。
c = counter() next(c) c.close() # 关闭生成器
Python中的生成器是一种非常强大的工具,提供了一种高效的方式来生成元素序列,同时避免了在内存中一次性存储整个序列的需要。通过yield语句和生成器表达式,可以轻松地创建和使用生成器。