当前位置:首页>python>Python基础篇 - Python中的生成器(Generator)

Python基础篇 - Python中的生成器(Generator)

  • 2026-10-11 14:35:34
Python基础篇 - Python中的生成器(Generator)
 Python中的生成器

    今天的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 = 1      while True:      yield a      a += 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 = 0    while True:        # 暂停,返回当前count;同时接收send传入的值        reset = yield count        if reset:  # 如果传入True,重置count为0            count = 0        else:  # 否则自增            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学习愉快。

<合集链接>
这里是我滴合集内容链接,大家感兴趣就康康吧。
1. 人工智能进阶之路 - 机器学习篇
2. AI发展前点
3. 人工智能进阶之路-Python基础篇
4. 充电er的乱坠闲聊
5. Origin认知
点个 赞 你最好看

最新文章

随机文章