19 生成器及解析双向通信

1. 基本概念

  • 生成器是一种特殊的迭代器
  • 使用yield替代return
  • 按需生成值,节省内存

2. 创建生成器的两种方式

方式一:生成器函数(使用yield)
def my_generator():
    yield 1
    yield 2
    yield 3
方式二:生成器表达式

# 类似列表推导式,但使用圆括号
 

g = (x*x for x in range(10))

3. 生成器的关键方法

# 创建生成器
def count_generator(n):
    for i in range(n):
        yield i

# 使用方法
g = count_generator(5)

# 获取值的三种方式
print(next(g))       # 逐个获取
print(list(g))       # 转换为列表
for value in g:      # 迭代
    print(value)

5、send的基本原理:

工作原理

  1. 双向通信:yield不仅可以向外部返回值,还可以接收外部发送的值
  2. 表达式赋值:yield作为表达式右侧时,可以接收send()传入的值
  3. 状态保持:生成器会记住上次执行位置,send()后从那里继续执行
# 基本语法
value = yield expression

这行代码做了两件事:

  1. 向外部返回expression的值
  2. 等待外部通过send()发送值,并赋给value

代码解刨:

def echo_generator():
    # 初始化输出值
    output_value = None

    while True:
        # yield右侧:返回output_value给外部调用者
        # yield左侧:接收外部send()的值并赋给input_value
        input_value = yield output_value

        # 将接收到的值赋给output_value,准备下次yield返回
        output_value = input_value

        # 可以对接收的值进行处理
        if input_value == "exit":
            return "生成器结束"

        print(f"生成器内部收到: {input_value}")


# 创建生成器
g = echo_generator()

# 预激生成器(必须步骤)
first_result = next(g)  # 执行到第一个yield并暂停
print(f"预激结果: {first_result}")  # None

# 发送数据并获取返回值
print(f"第一次send结果: {g.send('你好')}")  # 发送"你好"并获取返回值
print(f"第二次send结果: {g.send('世界')}")  # 发送"世界"并获取返回值

# 发送退出信号
try:
    print(g.send("exit"))
except StopIteration as e:
    print(f"捕获到返回值: {e.value}")



调用链:

"""
外部调用                 生成器内部
---------                ---------
next(g)      ------>     yield output_value (初始为None)
             <------     返回None

g.send("你好") ------>   input_value = "你好"
                         output_value = input_value
                         处理input_value
             <------     yield返回output_value("你好")

g.send("世界") ------>   input_value = "世界"
                         output_value = input_value
                         处理input_value
             <------     yield返回output_value("世界")
"""

打印结果:

预激结果: None
生成器内部收到: 你好
第一次send结果: 你好
生成器内部收到: 世界
第二次send结果: 世界
捕获到返回值: 生成器结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值