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

Python中的yield关键字,掌握生成器的精髓

Python 中的 yield 关键字用于定义一个生成器(generator)。生成器是一种特殊的迭代器,它允许你逐个产生值,而不是一次性创建并返回一个包含所有值的列表。使用 yield 的函数被称为生成器函数,它们在执行时不会直接返回值,而是在每次迭代时返回一个值。

基本生成器函数

def my_generator():yield 1yield 2yield 3

使用生成器函数时,你可以这样做:

gen = my_generator()
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

迭代生成器

生成器可以直接用于 for 循环:

for value in my_generator():print(value)

使用 yield 进行复杂的迭代

yield 不仅可以用于简单的值返回,还可以用于复杂的迭代逻辑,包括多层嵌套循环。

def power_two(max):for number in range(1, max + 1):yield number * 2for power in power_two(5):print(power)

发送值到生成器

生成器函数可以通过 send() 方法接收值。这允许在生成器的执行过程中进行更复杂的交互。

def echo():while True:print("输出值前")value = yieldprint(f"收到值: {value}")gen = echo()
next(gen)  # 初始化生成器,进入循环
gen.send(42)  # 输出: 收到值: 42
gen.send(10) # 输出: 收到值: 10

使用 yield from

yield from 允许你在生成器中委托给另一个生成器或迭代器,这有助于简化代码并避免多层嵌套。

def leaf():yield '叶'yield '子'def branch():yield '枝'yield from leaf()yield '条'for item in branch():print(item)

异常处理

生成器也支持 tryexceptfinally 语句,用于处理可能出现的异常。

def simple_generator():try:yield 1yield 2except ValueError as e:yield str(e)finally:yield '完成'for value in simple_generator():print(value)

生成器的 __iter____next__ 方法

生成器默认实现了 __iter____next__ 方法,这使得它们可以被用作迭代器。

gen = my_generator()
print(gen.__next__())  # 输出: 1
print(gen.__next__())  # 输出: 2
print(gen.__next__())  # 输出: 3

结论

yield 关键字在Python中提供了一种优雅的方式来创建生成器,它们是实现迭代协议的强大工具。生成器在内存使用上非常高效,因为它们不需要一次性存储所有值,而是按需产生值。这使得生成器非常适合处理大数据集或无限序列。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux下宝塔负载100%解决方法
  • 存储+调优:存储-IP-SAN
  • NumPy 随机数据分布与 Seaborn 可视化详解
  • 请叙述Vue 中使用了哪些设计模式
  • 安装和配置 FRP (Fast Reverse Proxy)
  • 第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解
  • Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)
  • 39. 组合总和 - 力扣(LeetCode)
  • 《Ai企业知识库》-模型实践-rasa开源学习框架-基础理论-02
  • Vue3(TypeScript)-CSSProperties代码示例及用法详解
  • ubuntu22.04安装cuda10.2
  • matlab 2023b 不要升级,升级用不了
  • android pdf文件预览
  • 【React】二次封装Antd的Table组件
  • SQL注释方法 -- 单行注释/多行注释
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • CentOS6 编译安装 redis-3.2.3
  • Date型的使用
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • python docx文档转html页面
  • SQLServer插入数据
  • 分布式熔断降级平台aegis
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 前端工程化(Gulp、Webpack)-webpack
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何设计一个比特币钱包服务
  • 入门级的git使用指北
  • 深度学习入门:10门免费线上课程推荐
  • 通信类
  • 详解NodeJs流之一
  • 携程小程序初体验
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #define 用法
  • $refs 、$nextTic、动态组件、name的使用
  • (1)虚拟机的安装与使用,linux系统安装
  • (java)关于Thread的挂起和恢复
  • (JS基础)String 类型
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)学习JVM —— 垃圾回收机制
  • (二十四)Flask之flask-session组件
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)大数的进制转换
  • (原)Matlab的svmtrain和svmclassify
  • (转)Oracle存储过程编写经验和优化措施
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...