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 = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return 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, line
    except 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}")

图片


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果手机safari浏览器的userAgent显示为电脑的userAgent问题解决

目录 1.问题背景 2.userAgent 3.解决 1.问题背景 开发了一个H5,是通过生成二维码,扫描这个二维码后就跳到这个H5,所以需要判断一下扫描的设备是否为手机,然后由于业务逻辑还需要判断一下手机是Android、iOS还是iPad。一般前端…

文件操作<C语言>

导言 平时我们在写程序时,在运行时申请内存空间,运行完时内存空间被收回,如果想要持久化的保存,我们就可以使用文件,所以下文将要介绍一些在程序中完成一些文件操作。 目录 导言 文件流 文件指针 文件的打开与关闭 …

Python 深入学习局部函数和闭包函数

目录 局部函数与闭包函数的关联 变量捕获与状态保留 应用场景的交集与差异 闭包的本质 局部函数示例 闭包函数示例 局部函数和闭包函数之间存在着密切的联系,同时也有一些本质的区别。 局部函数与闭包函数的关联 局部函数(Nested Function&#…

【机器学习 复习】第9章 降维算法——PCA降维

一、概念 1.PCA (1)主成分分析(Principal ComponentAnalysis,PCA)一种经典的线性降维分析算法。 (2)原理,这里以二维转一维为例,原来的平面变成了一条直线 这是三维变二…

Java | Leetcode Java题解之第179题最大数

题目: 题解: class Solution {public String largestNumber(int[] nums) {int n nums.length;// 转换成包装类型,以便传入 Comparator 对象(此处为 lambda 表达式)Integer[] numsArr new Integer[n];for (int i 0;…

Windows 11 安装hp 1020 plus 打印机驱动 (Ubuntu 20.04.3 LTS 部署cups局域网共享打印服务器)

1 win11 下载HP laserjet 1020 plus驱动,可以官网下载哦 链接下载 2 手动添加hp laserjet 1020驱动: 控制面板-->查看设备和打印机-->打印机和扫描仪-->添加设备-->我需要的打印机不在列表中-->通过手动添加-->按名称选择共享打印机 如果找不到&#xff0…

【ajax基础04】form-serialize插件

目录 一:form-serialize插件 作用: 语法格式: 一:form-serialize插件 作用: 快速且大量的收集表单元素的值 例如上图对于多表单元素的情形,单靠通过”选择器获取节点.value”值的形式,获取…

Excel做简单的趋势预测

这种方法不能代替机器学习,时序分析等,只是为后面的时序预测提供一个经验认识。 step1 选中序号列(或时间列)与预测列如图1所示: 图1 step2 工具栏点击“数据”,然后再“数据”下点击“预测模型”&#x…

apache activeMq

https://blog.csdn.net/qq_29651203/article/details/108487924 游览器输入地址: http://127.0.0.1:8161/admin/ 访问activemq管理台 账号和密码默认为: admin/admin# yml配置的密码也是如下的密码 activemq:url: failover:(tcp://localhost:61616)username: adminpassword: ad…

水果销售系统

摘 要 随着电子商务的快速发展,传统的实体销售模式面临着越来越多的挑战。在这个数字化的时代,消费者的购物习惯发生了翻天覆地的变化,消费者更倾向于在家中通过网络平台浏览并购买商品,这无疑给传统水果销售带来了极大的挑战。为…

高通安卓12-固件升级

下载步骤 第一步 格式化 「下载一次即可;能开机能下载的板子 忽略这一步,直接执行第二步即可」 QFIL工具配置为UFS类型,勾选Provision,如下图: Programmer选择prog_firehose_ddr.elf,Provision Xml选择prov…

前端 CSS 经典:mix-blend-mode 属性

前言&#xff1a;这是一个混合属性&#xff0c;作用是将两个颜色混合生成一个新颜色。可以将视频和文字相融合&#xff0c;产生动态文字效果。 效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" />&l…

pytest测试框架pytest-sugar插件生成进度条

Pytest提供了丰富的插件来扩展其功能&#xff0c;介绍下插件pytest-sugar&#xff0c;可以帮助我们在控制台中显示彩色的测试结果和进度条&#xff0c;提供失败的堆栈回溯信息。 为了使用 pytest-sugar&#xff0c;需要满足以下条件&#xff1a; Python 3.8 或更高版本pytest…

移远通信发布高性价比智能模组SC200P系列,赋能金融支付等行业智慧升级

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;为满足智慧金融、智能家居、智能穿戴、工业手持等消费和工业应用对高速率、多媒体、长生命周期等终端性能的需求&#xff0c;其正式推出基于紫光展锐UNISOC 7861平台的全新8核4G智能模组SC200P系列…

FPGA 690T 高速存储设计

高速存储设计会有各种需求的考虑&#xff0c;那么对应的方案也不完全相同&#xff0c;这篇文章出一期纯FPGA实现的高速存储方案。用纯fpga实现高速存储板卡有易国产化&#xff0c;功耗低和体积小等特点&#xff0c;缺点就是灵活性不是很强&#xff0c;实现标准ext4和nfs文件系统…

linux最大线程数限制及打开最大文件数

1.root用户下执行 ulimit -a 然后查看 max user processes 这个值通常是系统最大线程数的一半 max user processes&#xff1a;当前用户同时打开的进程(包括线程)的最大个数为 2.普通用户下 ulimit -a 出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.co…

jarvisoj_level2

首先检查checksec 可以看见no canary found 说明可能是栈溢出 运行一下程序 随便输一个,得到hello world(感觉这一步好像没啥用,没有RE那用) IDA 32 打开 后门 漏洞点 buf: 代码思路:利用溢出,把buf填满,然后构造程序,得到获取shell的目的 exp来自 BUUCTF—jarvisoj_level…

UE4引擎支持HTML5

文章目录 目的UE版本html5版本编译HTML5小结目的 本篇文章主要写下UE4如何编译支持HTML5,至于为什么是UE4而不是UE5,或者一些其他的话题,本篇不做讨论。 UE版本 先来看看UE的版本管理,如下图:有大概70个分支,有些还在维护,有些还在升级;tags有200多个,很可能还会增…

学习笔记——路由网络基础——路由的高级特性

七、路由的高级特性 1、路由迭代(路由递归) 路由必须有直连的下一跳才能够指导转发&#xff0c;静态路由或BGP路由的下一跳可能不是直连的邻居&#xff0c;因此需要计算出一个直连的下一跳和对应的出接口&#xff0c;这个过程就叫做路由迭代(路由递归)。 添加一条去往20.1.1.…

Android简单登录界面布局设计

<ImageView android:id“id/yxlg” android:layout_marginTop“12dp” android:layout_marginLeft“80dp” android:layout_width“30dp” android:layout_height“30dp” android:background“drawable/net” /> <TextView android:paddingTop“5dp” andr…