Python生成器: send函数、close函数与yield关键字协作

  参考:https://blog.csdn.net/weixin_40247263/article/details/82724878

  本文讲解Python生成器的send,close函数与yield关键字协作

  

  generator的seng()函数和yield关键字

  以之前对yield关键字的了解,无非就是yield关键字可以给调用者返回消息,同时当函数通过yield关键字返回消息以后函数会暂停在当前位置。

  首先复习一下生成器yield关键字的使用

  test.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 定义一个生成器生成从2开始无限翻倍的数字序列
# 2 4 8 16 32 
def test():
    number = 1
    while True:
        number = number * 2
        yield number
        print('我是yield关键字下面一行代码')
 
t = test()
print(next(t))
# 2
print(next(t))
# 我是yield关键字下面一行代码
# 4
print(next(t))
# 我是yield关键字下面一行代码
# 8

  解析输出过程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   以此类推,这个生成器是无限的,如果使用for循环进行迭代则需要设置退出条件

  但其实yield关键字的作用是函数与调用者的通信,它不光能够将值返回给调用者,它还可以接收调用者传过来的值,那么怎么实现呢?调用者通过send()函数将值传递给generator,generator通过yield前面的变量来接收,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def test():
    number = 0
    while True:       
        n = yield number
        print('我是yield关键字下面一行代码')
        print('通过send函数传递的值是:',n)
 
t = test()
print(t.send(None))
# 0
print(t.send(1))
# 我是yield关键字下面一行代码
# 通过send函数传递的值是: 1
# 0

  输出结果分析

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   即执行send相当于执行了next不一样的是send可以传递参数给生成器,如果传递的参数为None则send方法等价于next方法。

  generator的close函数

  由于下面还涉及到一个 close函数,这里也演示一下,方便下面理解

1
2
t.close()
print(next(t))

  关闭generator后再调用,会出现StopIteration异常,即后面没值了。

posted @   minseo  阅读(241)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2020-09-28 ansible笔记(7):常用模块之系统类模块
2020-09-28 ansible笔记(6):常用模块之命令类模块
2020-09-28 ansible笔记(5):常用模块之文件操作(二)
点击右上角即可分享
微信分享提示