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

浅谈 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.xdnf.cn/news/15263.html

相关文章:

  • 力扣 hot100 Day42
  • 若依前后端分离Vue3版本接入阿里云OSS
  • 20250712-1-Kubernetes 监控与日志管理-K8s日志管理与维护_笔记
  • Softmax回归(多类逻辑回归)原理及完整代码示例实现
  • 一个基于数据库的分布式锁:乐观与悲观实现
  • 贪心算法题解——跳跃游戏【LeetCode】
  • Windows 用户账户控制(UAC)绕过漏洞
  • python学习笔记【1】对字符串的处理
  • 《Java Web程序设计》实验报告六 JSP+JDBC+MySQL实现登录注册
  • [vroom] 启发式算法(路径评估) | 局部搜索优化引擎 | 解决方案输出解析
  • 自助KTV选址指南与优化策略
  • 系统分析师-计算机系统-输入输出系统
  • 十三、K8s自定义资源Operator
  • 仅27M参数!SamOutVX轻量级语言模型刷新认知,小身材也有大智慧
  • 2025.7.12总结
  • Vue 项目打包部署还存在问题?你知道怎么做吧?
  • JVM回收
  • 内部类 示例
  • 【java安全】springBoot配置文件属性名自定义及属性值加密
  • 【6.1.0 漫画数据库技术选型】
  • 建造者模式(Builder)
  • 【Datawhale AI 夏令营】 用AI做带货视频评论分析(二)
  • 微服务环境下的灰度发布与金丝雀发布实战经验分享
  • 【电脑】硬盘驱动器(HDD)的基础知识
  • 消息认证码(message authentication code)MAC
  • skywalking镜像应用springboot的例子
  • 【设计模式】单例模式 饿汉式单例与懒汉式单例
  • jenkins自动化部署前端vue+docker项目
  • 并发--Callable vs Runnable
  • 代码随想录算法训练营第三十二天|LeetCode 509 斐波那契数,LeetCode 70 爬楼梯,LeetCode 746 使用最小花费爬楼梯