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

深入了解python生成器(generator)

生成器

生成器是 Python 中一种特殊类型的迭代器。生成器允许你定义一个函数来动态产生值,而不是一次性生成所有值并将它们存储在内存中。生成器使用 yield 关键字来逐个返回值。每次调用生成器函数时,函数会在 yield 语句暂停,并记住当前的执行状态,以便下次从该点继续执行。

生成器的特点

  1. 惰性求值:生成器会在需要时生成值,而不是一次性生成所有值,节省内存。
  2. 保持状态:生成器记住上次返回值的位置,并从该点继续执行。
  3. 简洁易读:使用生成器表达式可以在单行代码中生成复杂的数据流。

如何定义生成器

生成器通过定义一个包含 yield 语句的函数来创建。当该函数被调用时,返回一个生成器对象。

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

使用 yield 语句

yield 语句用于生成一个值,并暂停函数的执行。函数状态会被保留,以便下次调用生成器函数时从暂停点继续。

def countdown(n):while n > 0:yield nn -= 1for num in countdown(5):print(num)

生成器表达式

生成器表达式是一种简洁的方式来创建生成器,类似于列表推导式,但使用圆括号而不是方括号。

gen_expr = (x * x for x in range(5))
for num in gen_expr:print(num)

内置生成器函数

Python 提供了一些内置函数,返回生成器对象,例如 range(), map(), filter()zip()

# range() 返回一个生成器
for i in range(5):print(i)# map() 返回一个生成器
squared = map(lambda x: x * x, range(5))
for num in squared:print(num)# filter() 返回一个生成器
evens = filter(lambda x: x % 2 == 0, range(10))
for num in evens:print(num)

生成器与内存效率

生成器在处理大量数据时特别有用,因为它们不需要一次性加载所有数据,而是按需生成数据,从而大大节省了内存

# 使用列表处理大数据
large_list = [x * x for x in range(10**6)]
# 使用生成器处理大数据
large_gen = (x * x for x in range(10**6))

yieldreturn 的区别

  • yield 生成一个值并暂停函数的执行,保留函数的状态。
  • return 结束函数的执行并返回一个值。
def simple_generator():yield "Hello"yield "World"def simple_function():return "Hello"return "World"gen = simple_generator()
print(next(gen))  # 输出:Hello
print(next(gen))  # 输出:Worldfunc = simple_function()
print(func)  # 输出:Hello

生成器的方法

生成器对象有以下方法:

  • __next__(): 返回生成器的下一个值,或在没有更多值时引发 StopIteration
  • send(value): 向生成器发送一个值,并返回下一个 yield 表达式的值。
  • throw(type, value=None, traceback=None): 在生成器中引发异常。
  • close(): 关闭生成器,终止其执行。
def generator():try:while True:value = (yield)print(f'Received: {value}')except GeneratorExit:print('Generator closed')gen = generator()
next(gen)
gen.send(10)
gen.send(20)
gen.close()

总结

生成器是 Python 中强大的工具,用于高效地处理大量数据或流数据。它们通过 yield 关键字生成值,保持函数状态,支持惰性求值,并且内存效率高。了解生成器的工作原理和用法,对于编写高效、可维护的 Python 代码至关重要。

相关文章:

深入了解python生成器(generator)

生成器 生成器是 Python 中一种特殊类型的迭代器。生成器允许你定义一个函数来动态产生值,而不是一次性生成所有值并将它们存储在内存中。生成器使用 yield 关键字来逐个返回值。每次调用生成器函数时,函数会在 yield 语句暂停,并记住当前的…...

【Linux】Xshell和Xftp简介_安装_VMware虚拟机使用

1、简介 Xshell简介 Xshell是一款强大的安全终端模拟软件支持SSH1、SSH2以及Microsoft Windows平台的TELNET协议。该软件通过互联网实现到远程主机的安全连接,并通过其创新性的设计和特色帮助用户在复杂的网络环境中高效工作。Xshell可以在Windows界面下访问远端不…...

【轮询负载均衡规则算法设计题】

一、题目描述 给定n台主机(编号1~n)和某批数据包,数据包格式为(抵达主机时刻,负载量)。这里数据每个时刻最多只有1条数据到达。负载量表示该主机处理此数据包总耗时。请计算轮询负载均衡规则下&#xff0c…...

张一鸣的产品哲学:与巨头共舞,低调中寻求突破

一、引言 在当今互联网竞争激烈的格局下,与巨头企业打交道是每个新兴科技企业都需面对的挑战。字节跳动创始人张一鸣在多次访谈中分享了他与巨头企业打交道的经验:保持低调、补齐技术、产品和市场各方面的能力。本文将探讨这一策略背后的产品哲学&#…...

【面试干货】throw 和 throws 的区别

【面试干货】throw 和 throws 的区别 1、throw1.1 示例 2、throws2.1 示例 3、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java中,throw和throws都与异常处理紧密相关,但它们在使用和含义上有明显的区别。…...

安卓手机删除的照片怎么恢复?3个方法,小技巧大作用

你是否曾经不小心删除了手机里的珍贵照片,却不知道怎么恢复?别担心,今天我们就来分享几个简单的小技巧,帮助你轻松找回那些丢失的照片。这些技巧虽然简单,但却能发挥大作用,让你不再为丢失照片而烦恼。手机…...

Unity制作背包的格子

1.新建一个面板 2.点击面板并添加这个组件 3.点击UI创建一个原始图像,这样我们就会发现图像出现在了面板的左上角。 4.多复制几个并改变 Grid Layout Group的参数就可以实现下面的效果了...

道可云元宇宙每日资讯|厦门:运用元宇宙技术助力直播电商发展

道可云元宇宙每日简报(2024年6月20日)讯,今日元宇宙新鲜事有: 厦门:运用元宇宙技术助力直播电商发展 近日,厦门市商务局印发《厦门市促进直播电商高质量发展若干措施(2024年-2026年&#xff0…...

电脑怎么卸载软件?多个方法合集(2024年新版)

在电脑的日常使用中,我们经常需要安装各种软件来满足不同的需求,但随着时间的推移,可能会出现一些软件不再需要或需要更换的情况。此时,及时从电脑上卸载这些不必要的软件是非常重要的。它不仅可以释放硬盘空间,还可以…...

【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别

目录 写在开头 一、CNN的原理 1. 概述 2. 卷积层 内参数(卷积核本身) 外参数(填充和步幅) 输入与输出的尺寸关系 3. 多通道问题 多通道输入 多通道输出 4. 池化层 平均汇聚 最大值汇聚 二、手写数字识别 1. 任务…...

面试技巧:正确回答JavaScript中Map和Object的选择问题

在JavaScript的面试中,对于何时使用Map和Object的选择问题,是一个常见的考察点。这两个数据结构都能存储键值对,但它们各有优势和适用场景。本文将深入探讨两者的区别,并通过实际代码示例来指导您如何选择。 基本概念 Map&#…...

sd StableDiffusion库学习笔记

目录 DeepSpeed realesrgan BasicSR超分辨率,去噪,去模糊,去 JPEG 压缩噪声 segment_anything mmengine controlnet_aux accelerate transfersformer pytorch_fid einops compel transfersformer 文本嵌入调整库 报错&#xff1a…...

【单片机毕业设计选题24017】-基于STM32的禽舍环境监测控制系统(蓝牙版)

系统功能: 系统分为主机端和从机端,主机端主动向从机端发送信息和命令,从机端 收到主机端的信息后回复温湿度氨气浓度和光照强度等信息。 主要功能模块原理图: 电源时钟烧录接口: 单片机和按键输入电路: 主机部分电路: 从机部分电路: 资料获取地址 主…...

每天一个数据分析题(三百七十八)- 系统聚类

在系统聚类方法中,哪种系统聚类是直接利用了组内的离差平方和? A. 最长距离法 B. 重心法 C. Ward法 D. 类平均法 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#…...

守护系统稳定性的关键技术之看门狗

目录 一、独立看门狗 二、窗口看门狗 三、总结 看门狗定时器(Watchdog Timer,WDT)是嵌入式系统中至关重要的组件,用于监控和维护系统的稳定性。主要是用来监测单片机运行状态和解决程序引起的故障的模块。在由单片机构成的微型…...

【Linux】进程间通信上 (1.5万字详解)

目录 一.进程间通信介绍 1.1进程间通信的目的 1.2初步认识进程间通信 1.3进程间通信的种类 二.匿名管道 2.1何为管道 2.1实现原理 2.3进一步探寻匿名管道 2.4编码实现匿名管道通信 2.5管道读写特点 2.6基于管道的进程池设计 三.命名管道 3.1实现原理 3.2代码实现 四.…...

测试用例设计:提升测试覆盖率的策略与方法

测试用例设计:提升测试覆盖率的策略与方法 前言测试用例设计的原则提高测试覆盖率的方法测试类型的分析 测试用例设计的基本方法等价类划分边界值分析正交法判定表法因果图法 方法与策略方法策略 如何评价测试用例结论 前言 在软件开发过程中,测试用例设…...

【微服务】什么是Hystrix?一文带你入门Hystrix

文章目录 强烈推荐引言主要功能实现容错应用场景1. 远程服务调用2. 防止级联故障3. 网络延迟和超时管理4. 资源隔离5. 高并发场景6. 熔断与自动恢复7. 故障检测与监控 示例应用场景使用实例1. 引入依赖2. 创建 Hystrix 命令类3. 使用 Hystrix 命令4. 配置 Hystrix5. 实时监控集…...

AI学习指南机器学习篇-支持向量机超参数调优

AI学习指南机器学习篇-支持向量机超参数调优 在机器学习领域中,支持向量机(Support Vector Machines,SVM)是一种非常常用的监督学习模型。它通过寻找一个最优的超平面来进行分类和回归任务。然而,在实际应用中&#x…...

掉电安全文件系统分析

掉电安全FS 掉电安全的文件系统(Power-Fail Safe File Systems)被设计为在电源故障或系统崩溃的情况下仍能保持数据一致性的文件系统。这样的文件系统通常通过使用日志(journaling)或写时复制(copy-on-write&#xff…...

【方案、开源】从零到国一:空地协同消防无人机系统全栈技术解析

1. 空地协同消防无人机系统设计思路 第一次接触这个项目时,我和很多同学一样感到无从下手。直到把整个系统拆解成几个核心模块,思路才逐渐清晰。这个系统的关键在于"空地协同"四个字,简单说就是让无人机和小车像两个配合默契的消防…...

如何在macOS上免费获得专业级音质:eqMac终极音频均衡器指南

如何在macOS上免费获得专业级音质:eqMac终极音频均衡器指南 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer 🎧 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 想让你的MacBook或iMac音质瞬间提升到专业水准…...

达摩院春联生成模型实战:输入两字祝福词,自动生成上下联和横批

达摩院春联生成模型实战:输入两字祝福词,自动生成上下联和横批 1. 春联生成模型简介 1.1 模型核心功能 达摩院AliceMind团队开发的春联生成模型是一款基于PALM大模型的专用AI工具,它能将简单的两字祝福词转化为完整的春联作品。这个模型特…...

TranslucentTB启动失败?3步快速解决VCLibs运行时依赖问题

TranslucentTB启动失败?3步快速解决VCLibs运行时依赖问题 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 当你满怀期待地安装…...

Qwen3-Reranker-0.6B保姆级教程:requirements.txt依赖版本兼容性避坑指南

Qwen3-Reranker-0.6B保姆级教程:requirements.txt依赖版本兼容性避坑指南 1. 引言:为什么依赖版本如此重要 当你第一次接触Qwen3-Reranker-0.6B这个强大的重排序模型时,可能会觉得安装过程很简单——不就是运行一个pip install命令吗&#…...

S2-Pro创意写作效果展示:多种文体与风格仿写

S2-Pro创意写作效果展示:多种文体与风格仿写 1. 开篇:当AI遇见创意写作 最近试用S2-Pro进行创意写作,结果让我这个老文案都感到惊艳。这款模型不仅能流畅生成各类文体,还能精准模仿名家风格,就像一位全能的文字魔术师…...

日程管理革命:OpenClaw解析Qwen3.5-9B生成的待办清单并同步日历

日程管理革命:OpenClaw解析Qwen3.5-9B生成的待办清单并同步日历 1. 为什么需要智能日程管理 每天早上打开电脑,我的第一件事就是对着记事本手忙脚乱地整理当天的待办事项。这种原始的工作方式持续了三年,直到我发现会议时间冲突、任务遗漏成…...

遇到复杂车线桥耦合分析总被建模效率卡脖子?试试Simpack+Abaqus/ANSYS这套组合拳,咱们直接上干货聊聊那些提效黑科技

simpack abaqus ansys车线桥耦合高效建模分析工具 1.快速生成非线性柔性轨节点处mark 2.桥梁纵向轨底处的对应的mark及坐标 3.快速建立力元并设置preload方向 4.免安装运行环境点击exe输入 5.基于ansys或者abaqus和simpack联合仿真的5跨、3跨简支梁车线桥耦合分析实例轨节点标记…...

将Windows 10打造成局域网精准时钟源:NTP服务器配置全攻略

1. 为什么需要局域网NTP服务器? 最近在帮朋友调试一个实验室的监控系统时,遇到了一个典型的时间不同步问题。十几台设备记录的视频时间戳相差从几秒到几分钟不等,排查故障时简直像在玩拼图游戏。这种场景在中小型办公网络、实验室环境特别常见…...

JC_Button按键库深度解析:嵌入式消抖与状态机设计

1. JC_Button 库深度解析:面向嵌入式工程师的按键消抖与状态机设计实践在嵌入式系统开发中,机械按键的抖动(Bounce)是硬件与软件协同设计中最基础、却极易被低估的挑战之一。一个未经处理的按键信号,在按下或释放瞬间会…...