python基础语法12-迭代器与生成器

Python 生成器与迭代器详解

在 Python 中,生成器和迭代器是处理大量数据时的强大工具。它们能够帮助我们节省内存,避免一次性加载过多数据。生成器通过 yield 关键字实现,允许我们逐步产生数据,而迭代器通过实现特定的接口(__iter____next__)定义对象的迭代行为。本文将深入探讨生成器与迭代器的概念、使用方法和实现方式。


1. 生成器(Generator)

生成器是一个特殊的迭代器,它的特点是延迟计算惰性求值。生成器函数在执行时不会立即计算出所有结果,而是根据需要逐个生成结果,适用于需要大量数据但又不希望一次性全部加载的场景。

1.1 使用 yield 关键字

生成器函数与普通函数的区别在于,它包含 yield 关键字。当 Python 执行到 yield 时,会暂停当前函数的执行,并返回 yield 后面的值。下一次调用生成器时,它会从上次 yield 停止的地方继续执行。

def my_generator():yield 1yield 2yield 3# 使用生成器
gen = my_generator()
print(next(gen))  # 输出 1
print(next(gen))  # 输出 2
print(next(gen))  # 输出 3

输出:

1
2
3

1.2 for 循环与生成器

生成器可以与 for 循环结合使用,自动管理迭代的状态,直到没有值为止:

def my_generator():yield 1yield 2yield 3for value in my_generator():print(value)

输出:

1
2
3

1.3 优势与特点

  • 节省内存:生成器只在需要时才计算出一个元素,避免了创建整个数据结构(如列表)导致的内存消耗。
  • 惰性求值:生成器不会一次性计算所有结果,而是按需计算,有助于提高程序性能。
  • 可暂停和恢复:生成器可以在中途暂停(yield),并在需要时从暂停处继续执行。

2. 迭代器(Iterator)

迭代器是一种设计模式,定义了如何逐个访问一个集合的数据。Python 中的迭代器对象需要实现 __iter__()__next__() 方法。

2.1 定义自定义迭代器

通过实现 __iter__()__next__() 方法,可以创建自己的迭代器对象。__iter__() 返回迭代器本身,而 __next__() 返回当前元素,并在结束时抛出 StopIteration 异常以通知迭代结束。

class MyIterator:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return self  # 迭代器返回自身def __next__(self):if self.current >= self.end:raise StopIteration  # 结束迭代self.current += 1return self.current - 1# 使用自定义迭代器
iterator = MyIterator(1, 4)
for value in iterator:print(value)

输出:

1
2
3

2.2 __iter__()__next__() 方法详解

  • __iter__():该方法返回一个迭代器对象。对于自定义迭代器,它通常返回自身(即 self)。
  • __next__():该方法返回序列中的下一个元素,并更新内部状态。当没有更多元素时,它需要抛出 StopIteration 异常,告知迭代器已完成。

3. 生成器与迭代器的比较

特性生成器(Generator)迭代器(Iterator)
定义使用 yield 关键字的函数,生成惰性数据必须实现 __iter____next__ 方法的类
内存效率节省内存,只在需要时生成数据需要完整实现迭代功能
实现复杂度简单,直接使用 yield相对复杂,需要手动实现 __next____iter__ 方法
用法直接使用 yield 创建生成器创建类并实现迭代器接口

  • 生成器:通过 yield 关键字创建,提供了惰性求值和按需计算的能力,适用于需要处理大量数据或不确定大小的数据集。它使得代码更加简洁且内存效率更高。
  • 迭代器:通过实现 __iter__()__next__() 方法定义如何遍历集合,适用于自定义迭代逻辑。它是实现生成器和其他迭代模式的基础。

通过合理使用生成器和迭代器,我们能够在 Python 中高效处理大量数据,提升程序的性能与可维护性。

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

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

相关文章

公司内部建立pypi源

有一篇建立apt源的文章在这里,需要的可以查看:公司内部建立apt源-CSDN博客 server: pip install pypiserver mkdir -d pypi/packages cp test.whl pypi/packages pypi-server run --port 8080 /home/xu/pypi/packages & 网页访问:http:…

VMware Workstation/Player 的详细安装使用指南

以下是 VMware Workstation/Player 的完整下载、安装指南,包含详细步骤、常见问题及解决方法,以及进阶使用技巧,适用于 Windows 和 macOS 用户。 VMware Workstation/Player 的详细安装使用指南—目录 一、下载与安装详细指南1. 系统要求2. 下…

蓝桥杯python组考前准备

1.保留k位小数 round(10/3, 2) # 第二个参数表示保留几位小数 2.输入代替方案(加速读取) import sys n int(sys.stdin.readline()) # 读取整数(不加int就是字符串) a, b map(int, sys.stdin.readline().split()) # 一行读取多个…

【JSON2WEB】16 login.html 登录密码加密传输

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

计算机网络起源

互联网的起源和发展是一个充满创新、突破和变革的历程,从20世纪60年代到1989年,这段时期为互联网的诞生和普及奠定了坚实的基础。让我们详细回顾这一段激动人心的历史。 计算机的发展与ARPANET的建立(20世纪60年代) 互联网的诞生…

洛谷P1824进击的奶牛简单二分

题目如下 代码如下 谢谢观看

如何建立高效的会议机制

建立高效的会议机制需做到:明确会议目标、制定并提前分发议程、控制会议时长、确保有效沟通与反馈、及时跟进执行情况。其中,明确会议目标是核心关键,它直接决定了会议的方向与效率。只有明确目标,会议才不会偏离初衷,…

开源AI大模型AI智能名片S2B2C商城小程序:科技浪潮下的商业新引擎

摘要: 本文聚焦于科技迅猛发展背景下,开源AI大模型、AI智能名片与S2B2C商城小程序的融合应用。通过分析元宇宙、人工智能、区块链、5G等前沿科技带来的商业变革,阐述开源AI大模型AI智能名片S2B2C商城小程序在整合资源、优化服务、提升用户体验…

基于大模型构建金融客服的技术调研

OpenAI-SB api接口 https://openai-sb.com/ ChatGPT与Knowledge Graph (知识图谱)分享交流 https://www.bilibili.com/video/BV1bo4y1w72m/?spm_id_from333.337.search-card.all.click&vd_source569ef4f891360f2119ace98abae09f3f 《要研究的方向和准备》 https://ww…

WSA(Windows Subsystem for Android)安装LSPosed和应用教程

windows安卓子系统WSA的Lsposed和shamiko的安装教程 WSA(Windows Subsystem for Android)安装LSPosed和应用教程 一、环境准备 在开始之前,请确保: 已经安装好WSA(Windows Subsystem for Android)已经安装好ADB工具下载好LSPosed和Shamiko框架安装包 二、连接WSA 首先需要…

辛格迪客户案例 | 河南宏途食品实施电子合约系统(eSign)

01 河南宏途食品有限公司:食品行业的数字化践行者 河南宏途食品有限公司(以下简称“宏途食品”)作为国内食品行业的创新企业,专注于各类食品的研发、生产和销售。公司秉承“质量为先、创新驱动、服务至上”的核心价值观&#xff…

手机静态ip地址怎么获取?方法与解析‌

而在某些特定情境下,我们可能需要为手机设置一个静态IP地址。本文将详细介绍手机静态IP地址详解及获取方法 一、什么是静态IP地址? 静态IP:由用户手动设置的固定IP地址,不会因网络重启或设备重连而改变。 动态IP:由路…

天下飞飞【老飞飞服务端】+客户端+数据库测试带视频教程

天下飞飞服务器搭建测试视频 天下飞飞【老飞飞服务端】客户端数据库测试带视频教程 完整安装教程。 测试环境 系统server2019 sql2022数据库 sql的安装 odbc搭建 sql加载数据库 此测试端能用于服务器搭建测试。 下载地址为:https://download.csdn.net/d…

Gitea的安装和配置以及应用

Gitea的安装和配置以及应用 一、安装 1、创建数据库和数据库账户(pg) su – postgres -c "psql" CREATE ROLE gitea WITH LOGIN PASSWORD gitea; CREATE DATABASE giteadb WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE …

如何更改OCP与metadb集群的连接方式 —— OceanBase运维管理

背景 许多用户都会借助OCP平台来进行OceanBase集群的运维与监控,且因为考虑单节点的OCP部署,在遇故障时可能会短时间出现无法管控 OceanBase集群,多数用户倾向于采用多节点方式来部署OCP,即 OCP的 metadb集群也是三节点的集群部署…

SpringDoc【使用详解】

SpringDoc使用详解 一、何为SpringDoc二、概念解释三、SpringDoc使用2.1简单集成2.2 配置SpringDoc2.2.1 yml方式配置2.2.2配置文档信息 2.3配置文档分组2.4使用注解2.4.1 Tag2.4.2 Operation2.4.3 Schema2.4.4 NotNull2.4.5 Parameter2.4.6 Parameters2.4.7 ApiResponses 和Ap…

PHP 阿里云oss 使用指南

1.介绍 把图片放到阿里云上的空间上,可以使用cdn加速。 可以在程序里直接调用 要使用阿里云 oss sdk ,请先到阿里云下载 或用 copmposer 安装 相关链接: 安装OSS PHP SDK_对象存储(OSS)-阿里云帮助中心 composer require aliyuncs/oss…

【AI提示词】常青笔记生成器

提示说明 生成适用于多个场景和领域的常青笔记,满足“常青笔记”的核心特性和结构。 提示词 # 角色: 常青笔记生成器## 角色简介: - 作者: xxx - 版本号: 1.0 - 更新时间: xxx - 语言: 中文## 定位: - 🎯 生成适用于多个场景和领域的常青笔记&#x…

在 Lua 中,`for` 和 `while` 是两种核心的循环结构的详细用法

在 Lua 中,for 和 while 是两种核心的循环结构,用于实现重复执行逻辑。以下是它们的详细用法、进阶技巧及注意事项: 在 Lua 中,for 和 while 是两种核心的循环结构的详细用法—目录 一、for 循环1. 数值 for 循环基础语法&#xf…

A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议

A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议,主要用于高质量音频流的无线传输。以下是A2DP协议的详细信息: 定义 A2DP协议允许音源设备(Source,简称SRC&#…