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

我们来看这么一个例子:

python 复制代码
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。


🔍 详细分析

当我们写:

python 复制代码
def greeter():
    name = yield "你是谁?"
    yield f"你好,{name}"

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

当我们调用 greeter():

python 复制代码
g = greeter()

Python 会:

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

我们可以验证:

python 复制代码
print(type(g))  # <class 'generator'>

这就意味着:

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

✅ 所以两种情况的对比:

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

✅ 举个例子验证一下

python 复制代码
def example():
    yield 42

print(example)      # <function example at 0x...>
print(example())    # <generator object example at 0x...>

✅ 总结

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

相关推荐
东莞市云毅网络有限公司6 小时前
AI 引用句逐条回指原文:让回答可回溯的校验实现
python·数据清洗·rag·企业知识库·文档解析
Sarvartha7 小时前
final 关键字
java·开发语言
数字融合8 小时前
透明化视频三维矿山井下照明重建技术
人工智能·python·数码相机
yi0118 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
程序员Sunday8 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
zhangzeyuaaa9 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
Marst Code9 小时前
上位机开发日记 · 第 2 篇 · 架构先行:六层分层与边界
python
李日华大战鸡红10 小时前
FOC状态空间方程模型推导(学习记录)
python·学习·线性代数
谢亮_vipxieliang10 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
思无邪6610 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能