首页 新闻 会员 周边

yield双向通信,一个“产出器”,又是一个“接收器”

0
[已解决问题] 解决于 2026-07-01 17:27

1. 视角一:作为“产出器”(对外返回值)

这是最基础的用法。yield 会把后面的值返回给外部调用者(比如 next() 或 for 循环),然后暂停函数执行。
  • 外部看到的返回值yield 后面的表达式结果。
  • 触发时机:外部调用 next() 时。

2. 视角二:作为“接收器”(对内接收值)

这是你提到的“恢复方式不同”的核心。当生成器暂停在 yield 处时,外部可以通过 gen.send(value) 恢复它。此时,外部传入的这个 value,就会成为这个 yield 表达式本身的返回值!
核心口诀:next() 相当于 send(None)。外部传什么值,yield 
*Tesla*的主页 *Tesla* | 老鸟四级 | 园豆:2024
提问于:2026-07-01 17:15
< >
分享
最佳答案
0
def my_generator():
    print("生成器启动")
    # 这里的 yield 既向外返回 1,又准备接收外部传来的值赋给 res
    res = yield 1  
    print(f"我收到了外部传来的值: {res}")
    yield 2

# 创建生成器对象
gen = my_generator()

# 第一步:启动生成器,遇到 yield 1 暂停
# 此时向外返回 1,但 res 还没被赋值(因为还没恢复)
print(next(gen))  
# 输出: 
# 生成器启动
# 1

# 第二步:使用 send() 恢复,传入 "Hello"
# 这个 "Hello" 会作为上一个 yield 表达式的返回值,赋给 res
print(gen.send("Hello")) 
# 输出: 
# 我收到了外部传来的值: Hello
# 2

# 第三步:如果用 next() 恢复,相当于 send(None)
# print(next(gen)) 
# 输出: 我收到了外部传来的值: None
yield 有一个极其反直觉的特性:赋值是延迟发生的。
在 res = yield 1 这行代码中:
  1. 当执行到这里时,Python 会立刻把 1 抛给外部,然后挂起(暂停)。
  2. 此时,res = ... 这个赋值动作根本没有执行,它被冻结了。
  3. 直到下一次外部调用 next()send() 唤醒它时,Python 才会把外部传来的值赋给 res,然后继续往下执行。

 

 
def my_generator():
    print("生成器启动")
    # 这里的 yield 既向外返回 1,又准备接收外部传来的值赋给 res
    res = yield 1  
    print(f"我收到了外部传来的值: {res}")
    yield 2

# 创建生成器对象
gen = my_generator()

# 第一步:启动生成器,遇到 yield 1 暂停
# 此时向外返回 1,但 res 还没被赋值(因为还没恢复)
print(next(gen))  
# 输出: 
# 生成器启动
# 1

# 第二步:使用 send() 恢复,传入 "Hello"
# 这个 "Hello" 会作为上一个 yield 表达式的返回值,赋给 res
print(gen.send("Hello")) 
# 输出: 
# 我收到了外部传来的值: Hello
# 2

# 第三步:如果用 next() 恢复,相当于 send(None)
# print(next(gen)) 
# 输出: 我收到了外部传来的值: None
 
  • 外部看到的返回值:yield 后面的表达式结果。
  • 触发时机:外部调用 next() 时。

 

 

 


 

 
 
  1. 当执行到这里时,Python 会立刻把 1 抛给外部,然后挂起(暂停)。
  2. 此时,res = ... 这个赋值动作根本没有执行,它被冻结了。
  3. 直到下一次外部调用 next()send() 唤醒它时,Python 才会把外部传来的值赋给 res,然后继续往下执行。

 

 
  1. yield 有返回值:对外返回 yield 后的值,对内接收 send() 传入的值。
  2. 下一次迭代才返回(赋值):赋值动作被挂起,直到下一次触发才执行。
  3. 恢复方式决定返回值:next() 传入 Nonesend("abc") 传入 "abc"
*Tesla* | 老鸟四级 |园豆:2024 | 2026-07-01 17:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册