Python15 理解Python迭代器

图片

1.Python中的迭代器

在Python中,迭代器是一种允许程序员遍历一个容器(特别是列表、元组、字典等集合类型)的对象,而不需要了解容器的内部结构。迭代器提供了一个统一的方法来逐一访问容器中的元素,这种机制称为迭代。

迭代器的核心概念:迭代器基于两个基本方法来完成其功能:

  1. __iter__()

    • 这个方法返回迭代器对象本身。这是使用forin语句时所必需的,因为Python的迭代协议要求一个对象要么有__iter__()方法,要么有__getitem__()方法。

  2. __next__()

    • 这个方法返回容器的下一个元素。当没有更多元素可供返回时,它应该抛出一个StopIteration异常,用来通知迭代循环结束。

迭代器的使用:

在Python中,直接作用于for循环的对象统称为可迭代对象(Iterable),任何实现了__iter__()__next__()方法的对象都是迭代器(iterator)。所有的Iterable均可以通过内置函数iter()来转变为Iteratoriter()函数用于获取迭代器,而next()函数用于逐一访问迭代器的元素。

2.迭代器的使用

① 使用方法

使用自定义迭代器:

class MyIterator:def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return value# 使用自定义的迭代器
my_iter = MyIterator([1, 2, 3, 4, 5])# 在for循环中使用迭代器
for item in my_iter:print(item)

图片

next()需要传入可迭代对象:

L=[1,2,3]  # L是一个可迭代对象,而不是一个迭代器
squares=[x**2 for x in L]
squares  # 同理,squares是一个可迭代对象
next(L)  # 将会抛出错误:TypeError: 'list' object is not an iterator

图片

my_list = [1, 2, 3, 4]
my_iter = iter(my_list)  # 创建迭代器对象print(next(my_iter))  # 输出 1
print(next(my_iter))  # 输出 2
print(next(my_iter))  # 输出 3
print(next(my_iter))  # 输出 4
print(next(my_iter))  # 抛出StopIteration异常,迭代结束

图片

import sys
list=[1,2,3,4]
it=iter(list)
while True:try:print(next(it))except StopIteration:sys.exit()

图片

需要将可迭代对象通过iter()转换成一个迭代器:

ls=[1,2,3,4]
it=iter(ls)  # 列表转换为一个迭代器
for x in it:print(x,end=" ")

图片

② 使用生成器生成迭代器

生成器是一种特殊类型的迭代器,它们可以被用来按需生成数据,而不是一次性地将数据加载到内存中。这样做可以提高程序的内存效率,特别是当处理大量数据时。下面的代码使用生成器(generator)创建一个逐个生成平方数的迭代器。

# 生成器
def gensquares(N):for i in range(N):yield i**2
for item in gensquares(5):print(item)

图片

使用普通函数创建一个逐个生成平方数的迭代器:

#使用普通函数
def gensquares(N):res=[]for i in range(N):res.append(i**2)return res
for i in gensquares(5):print(i)

图片

③ 迭代器协议

Python使用迭代器协议让for循环变得更加通用,许多Python的内置函数,如summinmaxmap等,都可以接受任何迭代器作为输入。这些函数使用迭代器协议来访问传入对象中的元素。例如sum函数可以接受任何迭代器,并计算其中元素的总和。

迭代器协议是Python的强大特性之一,它允许内置函数和控制结构以统一的方式处理多种类型的数据集合。通过支持这个协议,生成器成为了处理序列数据的灵活和强大工具,尤其是在数据量大或数据产生代价高的场景中。

# 使用生成器表达式创建一个生成器
numbers = (x * x for x in range(5))  # 生成 0, 1, 4, 9, 16
# 使用sum函数计算这些值的和
total = sum(numbers)
print(total)  # 输出 30
④ 生成器的惰性求值(Lazy Evaluation)

生成器的惰性求值(Lazy Evaluation)是指在真正需要数据之前不进行任何计算或数据生成的编程技术。这种策略允许代码只在结果真正被需要时才执行运算,从而节省资源和提高程序的效率。

从一个文本文件input.txt中按行读取内容,并且仅当行中包含指定关键词‘Hello’时,逐行返回这些匹配的行(10行中提取了6行含有关键词的文本行)。这种方式是处理大文件的有效方法,因为它允许按需读取数据,而不必一次性将整个文件加载到内存中。

图片

import chardet  # 自动检测文件编码的库def detect_encoding(file_path):  # 定义一个检测文件编码的函数with open(file_path, 'rb') as f:rawdata = f.read()return chardet.detect(rawdata)['encoding']def search_in_file(path, keyword):try:# 检测文件编码encoding = detect_encoding(path)# 使用检测到的编码打开文件with open(path, 'r', encoding=encoding) as file:for line_number, line in enumerate(file, 1):  # 遍历文件的每一行,使用 enumerate 函数获取行号,并检查是否存在关键字if keyword in line:yield line_number, lineexcept FileNotFoundError:print("文件未找到,请检查文件路径。")except Exception as e:print(f"读取文件时发生错误:{e}")# 示例
filename = r'F:\桌面\python100\input.txt'
keyword = "Hello"
for line_number, matching_line in search_in_file(filename, keyword):print(f"第 {line_number} 行: {matching_line}")

图片


以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

使用自签名 TLS 将 Dremio 连接到 MinIO

Dremio 是一个开源的分布式分析引擎,为数据探索、转换和协作提供简单的自助服务界面。Dremio 的架构建立在 Apache Arrow(一种高性能列式内存格式)之上,并利用 Parquet 文件格式实现高效存储。有关 Dremio 的更多信息,…

应用占内存,应用太耗电。不如冻起来!

在安卓系统中,一些不常用的系统组件、进程或顽固应用可能会持续在后台运行,占用宝贵的内存资源,导致手机出现卡顿、续航减少等问题。今天我将向您推荐几款实用的应用冻结工具,它们能够帮助您冻结或隐藏这些不必要的应用&#xff0…

最新PHP仿猪八戒任务威客网整站源码/在线接任务网站源码

资源介绍 老规矩,截图为亲测,前后台显示正常,细节功能未测,有兴趣的自己下载。 PHP仿猪八戒整站源码下载,phpmysql环境。威客开源建站系统,其主要交易对象是以用户为主的技能、经验、时间和智慧型商品。经…

Vue81-独享路由守卫

一、 独享路由守卫的定义 当只有某个特定的路由需要做校验的时候,可以在改路由组件规则的地方单独配置独属于改组件的路由守卫。 二、示例 1、需求 系统只在进入新闻路由页面的时候做校验。 2、代码实现 注意: 独享路由守卫,只有前置路由守…

Spring Gateway转发websocket原理

Spring Cloud Gateway简称Spring Gateway,它可以转发请求到后端微服务。Spring Gateway除了转发HTTP请求,也支持websocket请求。我们看下它是怎么实现的吧。 配置支持websocket转发 支持websocket转发,需要用到spring-cloud-starter-gatewa…

高通安卓12-OTA 升级

1.OTA介绍 OTA 英文全称是 Over-the-Air Technology,即空间下载技术的意思。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主 要通过网络[例如 WIFI、3G]自动下载 OTA 升级包、自动升级,但…

TCP协议详解:三次握手与四次挥手

TCP协议详解:三次握手与四次挥手 目录 TCP协议详解:三次握手与四次挥手 一、TCP协议概述 二、TCP连接建立:三次握手 三、TCP连接释放:四次挥手 四、TCP协议的可靠性机制 五、TCP流量控制与拥塞控制 一、TCP协议概述 TCP(传输控制协议)是一种面向连接的、可靠的、基于…

Windows11系统自动获取电脑IPV6地址,并且开机自动发送到指定邮箱

废话:最近放假回家,在家里突然想玩游戏了,Steamdeck性能终归有限。部分游戏始终玩的不爽,想到之前了解到的SunshnieMoonlight串流的方案,远程调用家里的电脑打游戏,简直不要太爽。 一顿折腾之后配置好了所有…

发送短信v2

接口说明 接口英文名 newSendCloudBaseSms 功能描述 发送携带 URL Link 的短信 注意事项 短信内容 短信由签名和正文内容组成: 短信签名是位于短信正文前【】中的署名,小程序发送短信时,签名为小程序名称。 正文内容是由短信模板和变…

【职场人】“万事皆可”领导的职场囧途

故事单元一:无所不能的承诺 在我的公司里,有一位领导,我们戏称他为“万事皆可”先生。每当有新的任务或挑战出现时,他总是第一个站出来,拍着胸脯说:“没问题,交给我吧!”他的这种自…

一种微弱故障特征增强的旋转机械故障诊断方法(MATLAB)

导致轴承失效的根本原因是由异常磨损和局部间的机械冲击所导致的。对轴箱轴承日常运转的下所产生的均匀磨损而言,其振动信号特征与正常轴承振动信号大致一样,随机性较强,其概率密度函数呈现出高斯分布的现象,但由于磨损所导致的不…

37 - 上级经理已离职的公司员工(高频 SQL 50 题基础版)

37 - 上级经理已离职的公司员工 selecte1.employee_id fromEmployees e1 left join Employees e2 on e1.manager_id e2.employee_id wheree2.manager_id is null and e1.manager_id is not null and e1.salary<30000;

《计算机英语》 Unit 5 Networking 网络

Section A Networking 网络 The need to share information and resources among different computers has led to linked computer systems, called networks, in which computers are connected so that data can be transferred from machine to machine. 不同计算机之间共享…

什么是正态分布

最重要的连续分布的通用名是概率密度函数&#xff0c;而标准正态分布&#xff08;Standard Normal Distribution&#xff09; 是最重要的概率密度函数。这个连续分布之所以重要&#xff0c;我认为是因为它非常常见&#xff0c;换句话说&#xff0c;我们会很常用到它。标准正态分…

C++基础编程100题-012 OpenJudge-1.3-10 计算并联电阻的阻值

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/09/ 描述 对于阻值为r1和r2的电阻&#xff0c;其并联电阻阻值公式计算如下&#xff1a; R 1/(1/r1 1/r2) 输入 两个电阻阻抗大小&#xff0c;浮点型&#xff0c;以一个空格分开。 输出 并联之后的阻…

【tomcat】tomcat系统架构以及核心启动流程

对于web后端开发工程师来说&#xff0c;tomcat作为一个应用服务器框架本质上就是一个HTTP服务Servlet容器。研究过spring、spring mvc源码的同学应该了解&#xff0c;spring mvc其实就是基于Servlet规范实现的请求的转发路由、转发处理。而Spring和SpringMVC就是通过web.xml文件…

如何在Java中使用正则表达式进行文本处理

如何在Java中使用正则表达式进行文本处理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;正则表达式&#xff08;Regular Expressio…

python将音频文件从8kHz采样率转换为16kHz采样率,并保持双声道,立体声

要将音频文件从8kHz采样率转换为16kHz采样率&#xff0c;并保持双声道&#xff0c;可以使用Python中的pydub库&#xff0c;它简单易用&#xff0c;非常适合这类音频处理任务。但请注意&#xff0c;使用pydub之前需要确保你的系统中已安装ffmpeg&#xff0c;因为pydub依赖于ffmp…

Elasticsearch过滤器(Filter):原理及使用

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

Ruby编程语言学习

学习Ruby编程语言&#xff0c;你可以按照以下步骤进行&#xff1a; ### 1. 基础知识入门 #### 安装Ruby - 访问Ruby官网&#xff08;https://www.ruby-lang.org/&#xff09;下载适合你操作系统的版本。 - 对于Linux用户&#xff0c;可以使用包管理器安装。 #### 学习资源 -…