当前位置: 首页 > news >正文

浅谈 Python 中的 yield——生成器对象与函数调用的区别

我们来看这么一个例子:

def greeter():name = yield "你是谁?"yield f"你好,{name}"g = greeter()
print(next(g))        # → "你是谁?"
print(g.send("张三")) # → "你好,张三"

执行流程:

next(g):执行到 yield,返回 "你是谁?";send("张三"):将 "张三" 送入上次 yield 表达式的返回值,继续执行。send() 是构建协程通信、任务调度器的核心机制之一(如 asyncio、trio、LangGraph 内核)。

g = greeter()是greeter() 执行的结果赋值给 g这个结果是一个生成器对象(generator),而不是把函数本身赋值给 g


🔍 详细分析

当我们写:

def greeter():name = yield "你是谁?"yield f"你好,{name}"

此时,greeter 是一个函数对象(还没执行)。

当我们调用 greeter()

g = greeter()

Python 会:

  • 执行函数定义,但并不运行函数体
  • 因为函数中含有 yield,所以它会返回一个 生成器对象,即 g 是一个 generator

我们可以验证:

print(type(g))  # <class 'generator'>

这就意味着:

g = greeter()  # g 现在是生成器对象,不是函数本身

✅ 所以两种情况的对比:

写法含义类型
g = greeter把函数本身赋值给变量 g,不执行<function>
g = greeter()执行函数,返回一个生成器对象<generator>

✅ 举个例子验证一下

def example():yield 42print(example)      # <function example at 0x...>
print(example())    # <generator object example at 0x...>

✅ 总结

greeter() 是函数调用表达式,执行时返回一个生成器对象;所以 g = greeter() 是在 将生成器对象赋值给 g,而不是将函数本身赋值给 g

http://www.dtcms.com/a/276449.html

相关文章:

  • 2025必问46道软件测试面试题(答案+文档)
  • Armstrong 公理系统深度解析
  • 网络安全初级第一次作业
  • super task 事件驱动框架
  • Openpyxl:Python操作Excel的利器
  • 浅谈npm,cnpm,pnpm,npx,nvm,yarn之间的区别
  • Python 数据建模与分析项目实战预备 Day 3 - 特征工程基础与数据预处理(针对简历结构化数据)
  • 使用iso制作ubuntu22.04docker镜像
  • 处理日期与时间
  • 【嵌入式电机控制#13】PID参数整定的全面步骤
  • ClickHouse 25.6 版本发布说明
  • 【华为机试】HJ68 成绩排序
  • 从0设计一个短链接服务:如何实现尽可能短、可变长的短网址系统?
  • 过拟合 跷跷板 幻觉 混合精度
  • 计算机毕业设计springboot影视周边推荐系统 基于SpringBoot的电影衍生品智能推荐平台 JavaWeb实现的影视文化周边个性化服务系统
  • git版本发布
  • 黑客工具Nessus介绍及其安装使用教程
  • 使用Kali Linux hydra进行密码爆破(仅供学习)
  • 质量属性场景(Quality Attribute Scenario)深度解析
  • mybatis模糊匹配采用concat与#{},动态sql讲解
  • 模拟专家协作网络——重塑LLM专业内容生成
  • C语言基础知识--枚举
  • 商业智能(BI)系统深度解析
  • Matlab R2024b下载及详细安装教程,附中文免费Matlab安装包(含离线帮助文档)
  • 为什么一个 @Transactional 注解就能开启事务?揭秘 Spring AOP 的底层魔法
  • 维基艺术图片: python + scrapy 爬取图片
  • 【读书笔记】《C++ Software Design》第一章《The Art of Software Design》
  • 典型的前后端交互数据示例
  • 消息认证码(message authentication code)MAC
  • 自动编码器:深度学习的特征提取与数据压缩利器