


今天的Python基础篇小知识点讲解生成器(Generator),大家这么聪明,一看就会了。

1. 生成器(Generator): Python中一种特殊的迭代器,它不需要提前创建并存储整个序列(比如列表),而是在迭代过程中动态生成数据,只能迭代一次,用完即销毁,可以极大节省内存空间。
相较于迭代器,生成器通过yield关键字就可以实现惰性计算,不需要手动定义繁琐的__iter__和__next__方法。
1.1 生成器推导式: 这是简易版的生成器对象创建方法,生成器推导式的语法和列表推导式几乎一致。
# 列表推导式(一次性生成所有数据,占用内存)list_nums = [x * 2 for x in range(5)]print("列表推导式结果:", list_nums) # 输出:[0, 2, 4, 6, 8]# 生成器推导式(仅创建生成器对象,未生成数据)gen_nums = (x * 2 for x in range(5))print("生成器对象:", gen_nums) # 输出:<generator object <genexpr> at 0x...># 迭代生成器(按需生成数据)print("迭代生成器:")for num in gen_nums:print(num, end=" ") # 输出:0 2 4 6 8# 迭代后生成器耗尽,再次迭代无输出print("\n耗尽后迭代:", list(gen_nums)) # 输出:[]
1.2 函数生成器:这是标准版的生成器对象创建方法,通过调用函数创建生成器对象,使用yield关键字,每次调用next()或迭代时,函数执行到yield处暂停,返回yield表达式后的值;再次调用时,从暂停处继续执行。
def my_generator():a = 1while True:yield aa += 1# 创建生成器对象gen = my_generator()# 第一次调用next():执行到第一个yieldprint(next(gen)) # 输出:1# 第二次调用next():从暂停处继续执行到第二个yieldprint(next(gen)) # 输出:2# 第三次调用next():继续执行到第三个yieldprint(next(gen)) # 输出:3
1.3 send()方法: send()是生成器的高级用法,既能触发生成器执行,又能向暂停的yield位置传入数据。
语法:接收的变量 = yield 要返回的值。
def counter():count = 0while True:# 暂停,返回当前count;同时接收send传入的值reset = yield countif reset: # 如果传入True,重置count为0count = 0else: # 否则自增count += 1# 创建生成器gen = counter()# 第一次调用需要初始化:send(None)(等价于next(gen))print(gen.send(None)) # 输出:0# 第二次调用:send(None),count自增为1print(gen.send(None)) # 输出:1# 第三次调用:send(True),重置count为0print(gen.send(True)) # 输出:0# 第四次调用:send(None),count自增为1print(gen.send(None)) # 输出:1



总结:今日我们学习了Python基础篇-Python中生成器(Generator)。生成器一种特殊的迭代器,核心优势在于“按需生成数据”,无需一次性存储整个序列,能大幅节省内存空间。生成器主要有两种创建方式:一是简易的生成器推导式,语法与列表推导式类似,仅将方括号换为圆括号,可快速创建简单生成器;二是函数生成器,通过在函数中使用yield关键字实现,调用函数不会立即执行代码,而是返回生成器对象,每次迭代或调用next()时执行到yield处暂停并返回值。此外,生成器的send()方法是高级用法,既能像next()一样触发生成器执行,还能向暂停的yield位置传入数据,需注意首次调用send()只能传None(等价于第一次的next())。生成器只能迭代一次,数据生成后即销毁,适用于处理大数据量场景在Python基础篇,后续我们将持续学习Python基础知识,祝每一位study er学习愉快。




