Python 中的生成器与 yield

在 Python 中,生成器(Generator)是一种特殊的迭代器,用于以惰性方式生成序列数据。与一次性将所有数据加载到内存的列表不同,生成器按需生成数据,大大节省内存开销。本文将深入解析生成器的工作原理和用法。

  1. 什么是生成器?

生成器本质上是一个返回迭代器的函数,使用 yield 关键字而不是 return。每次调用生成器的 next() 方法(或通过 next() 函数),函数会暂停并返回一个值,继续运行时从暂停的地方恢复。

  1. 定义生成器

生成器使用简单的函数定义:

def my_generator():
yield 1
yield 2
yield 3

使用生成器:

gen = my_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

  1. 使用场景
  2. 替代列表,节省内存

普通列表

squares = [x**2 for x in range(1000000)]

生成器

squares_gen = (x**2 for x in range(1000000))

生成器表达式 (x**2 for x in range(1000000)) 仅在需要时生成值,而不会一次性占用内存。

  1. 大文件逐行读取

def read_large_file(file_path):
with open(file_path, ‘r’) as file:
for line in file:
yield line.strip()

使用生成器逐行处理文件

for line in read_large_file(“large_file.txt”):
print(line)

  1. 无限序列

def infinite_sequence():
num = 0
while True:
yield num
num += 1

gen = infinite_sequence()
print(next(gen)) # 0
print(next(gen)) # 1

  1. yield 的高级用法
  2. 双向通信

def generator():
value = yield “Start”
yield f"Received: {value}"

gen = generator()
print(next(gen)) # Start
print(gen.send(“Hello”)) # Received: Hello

  1. 生成器的关闭
    可以通过 gen.close() 主动关闭生成器,或使用 try…finally 确保生成器正常结束。

  2. 生成器 vs 列表

特性 生成器 列表
内存占用 按需生成,内存小 全部加载,占用大
迭代方式 一次性,不能回溯 可随机访问元素
使用场景 数据流、无限序列 小数据集

总结

生成器是 Python 中处理大数据和流式数据的强大工具。它以高效、优雅的方式处理数据流,特别适合内存有限或数据规模未知的场景。通过合理使用生成器,你的代码将更加高效和灵活!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502333.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成模型的现状2025年的新兴趋势

2024年对人工智能而言是极为出色的一年。在文本生成和图像生成这两方面,我们目睹了模型能力全方位出现了类似阶跃函数般的巨大提升。这一年起始时OpenAI占据主导地位,而到了年末,Anthropic的Claude成了我常用的大型语言模型,并且还…

PWN 的知识之如何利用栈溢出利用后门函数

PWN 的知识之如何利用栈溢出利用后门函数 利用栈溢出漏洞调用原本存在的后门函数(例如 get_flag 或system("/bin/sh"))是二进制漏洞利用中的一种常见技术,相信各位网安的师傅或多或少都听说过,那么如何利用栈溢出来利用后门函数呢…

基于YOLO11的道路缺陷检测系统

基于YOLO11的道路缺陷检测系统 (价格90) 包含 [cracks, potholes] [裂缝, 凹坑] 2个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolo11的权重文件,运用在其他…

JAVA:Spring Boot 集成 Quartz 实现分布式任务的技术指南

1、简述 Quartz 是一个强大的任务调度框架,允许开发者在应用程序中定义和执行定时任务。在 Spring Boot 中集成 Quartz,可以轻松实现任务的调度、管理、暂停和恢复等功能。在分布式系统中,Quartz 也支持集群化的任务调度,确保任务…

数据分析-Excel

数据类型和函数初步 Excel中有文本类型和数值类型–但是无法用肉眼分辨出来isnumber来区分是否是数值类型text和value函数可以完成数值类型以及文本类型的转换单元格第一位输入’方式明确输入的是文本sum函数必须是数值类型 文本连接-and-or-not-if-mod-max函数 字符串的连接…

深入了解 SSL/TLS 协议及其工作原理

深入了解 SSL/TLS 协议及其工作原理 一. 什么是 SSL/TLS?二. SSL/TLS 握手过程三. SSL/TLS 数据加密与传输四. 总结 点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都在歌唱 一. 什么是 SSL/TLS? 安全套接层&am…

【NLP高频面题 - Transformer篇】Transformer的输入中为什么要添加位置编码?

Transformer的输入中为什么要添加位置编码? 重要性:★★★ Transformer 将句子中的所有词并行地输入到神经网络中。并行输入有助于缩短训练时间,同时有利于学习长期依赖。不过,并行地将词送入 Transformer,却不保留词…

【Unity3D】UGUI Canvas画布渲染流程

目录 Screen Space - Overlay Screen Space - Camera World Space UI合批分析(建议不看 直接看FrameDebugger测试) 优化UI合批 1、Image图片纹理不同导致合批失败 2、文本和图片相交以及排序对合批的影响 参考文档:画布 - Unity 手册…

计算机的错误计算(二百零一)

摘要 用两个大模型计算 ,结果保留 10位有效数字。实验表明,两个大模型的输出均只有1位正确数字;并它们几乎相同:仅最后1位数字不同。 例1. 计算 , 结果保留 10位有效数字。 下面是与一个数学解题器的对话。 以上为与一个数学解…

完全分布式部署Hadoop集群

(1)第一步:安装Hadoop,使用如下命令: tar -zvxf /export/software/Hadoop-3.3.4.tar.gz -C /export/servers (2)第二步:配置Hadoop系统环境变量 在liumengting1上执行vi /etc/profile命令配置系统环境变量profile,在…

Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。详细介绍Hash(哈希)的扩容机制(rehash)、源码、以及扩容和缩容过程。 文章目录 Redis 字典(dict)结构源码哈希…

使用命令行管理git项目

# 初始化一个新的Git仓库 git init # 添加文件到暂存区 git add <file> # 提交暂存区的更改到仓库 git commit -m "commit message" # 查看当前仓库的状态 git status # 查看提交历史 git log # 查看文件的改动 git diff <file> # 创建一个新…

设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种封装对象创建过程的方式&#xff0c;使得对象的创建与使用分离&#xff0c;从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与…

【Block总结】Conv2Former中的Block,卷积调制块,简化了自注意力机制,提高了内存效率

论文介绍 论文链接&#xff1a;https://arxiv.org/pdf/2211.11943 研究背景&#xff1a;论文指出&#xff0c;尽管当前研究者们通过利用大核卷积、高阶空间交互或稀疏卷积核等方法对卷积神经网络&#xff08;ConvNets&#xff09;的设计进行了重新思考&#xff0c;但如何更有…

w139华强北商城二手手机管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

ThreadPoolExecutor keepAliveTime 含义

现象 在线上环境排查问题时&#xff0c;某个线程池在某个时间点新建线程达到设定的最大线程数 maximumPoolSize&#xff0c;后续流量降低后当前线程数仍未回落&#xff0c;仍然为最大线程数&#xff0c;阻塞队列中有任务&#xff0c;但是活跃线程数显著减少。 之前的认知 固…

如何恢复已删除的 Telegram 消息 [iOSamp;Android]

Telegram 是一款功能强大的消息应用程序&#xff0c;因其易用性、隐私保护和众多炫酷功能而深受用户喜爱。然而&#xff0c;有时我们会不小心删除重要的消息。在这种情况下你应该做什么&#xff1f; 本文将为您提供简单有效的解决方案来恢复 Telegram 上已删除的消息&#xff…

Outlook2024版如何回到经典Outlook

Outlook2024版如何回到经典Outlook 如果新加入一家公司&#xff0c;拿到的电脑&#xff0c;大概率是最新版的Windows, 一切都是新的。 如果不coding, 使用国产的foxmail大概就可以解决一切问题了。可惜老程序员很多Coding都是基于传统Outlook的&#xff0c;科技公司所有人都是I…

动态库dll与静态库lib编程4:MFC规则DLL讲解

文章目录 前言一、说明二、具体实现2.1新建项目2.2 模块切换的演示 总结 前言 动态库dll与静态库lib编程4&#xff1a;MFC规则DLL讲解。 一、说明 1.前面介绍的均为Win32DLL&#xff0c;即不使用MFC的DLL。 2.MFC规则DLL的特点&#xff1a;DLL内部可以使用MFC类库、可以被其他…

若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)

若依中Feign调用具体使用 注意&#xff1a;以下所有步骤实现的前提是需要在启动类上加入注解 EnableRyFeignClients 主要是为开启feign接口扫描 1.创建服务提供者(provider) 导入依赖(我在分析依赖时发现若依本身已经引入openfeign依赖,并在此基础上自定义了自己的EnableRyF…