迭代器和生成器

CCF CSP历年题解(python) 菜鸡一枚,没参加过算法竞赛,单纯为了抵研究生考试复试才刷题,通过写博客记录下来,希望能和大家互相交流,代码质量不高,大家见谅。 因为考研等原因,题目不定期更新… 第一题 201312-1出现最多次数的数 ... 阅读详情

迭代器:可以被next()函数调用并不断返回下一个值的对象

生成器:是一种特殊的迭代器,可以用yield语句来返回值,每次调用next()函数,

 都会执行yield语句直到遇到下一个yield语句,然后返回yield语句后面的值

迭代器和生成器的区别:

迭代器一次性返回所有值,而生成器返回一个值,需要多次调用next()函数才能返回下一个值

迭代器只能遍历一次,而生成器可以多次遍历

迭代器占用内存小,生成器占用内存大

迭代器只能用于一次性遍历,而生成器可以用于迭代和生成值

迭代器可以用for循环,而生成器只能用next()函数

迭代器可以用list()函数转换为列表,而生成器只能用list()函数一次性转换为列表

迭代器可以用next()函数获取下一个值,而生成器只能用send()函数发送值给生成器,

 然后生成器会返回yield语句后面的值

1、迭代器

在Python中,迭代器是一个可以记住遍历位置的对象。它从集合的第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前不会后退。要创建一个迭代器,你需要实现两个方法:__iter__()和__next__()。__iter__()方法返回迭代器对象本身,而__next__()方法返回下一个元素。如果不再有元素可返回,__next__()方法会引发一个StopIteration异常。

  • __iter__():返回自身。

  • __next__():返回下一个元素;如果没有更多元素,则抛出 StopIteration 异常。

1.1 特点

  1. 惰性计算:按需生成数据,节省内存。

  2. 实现协议:

    • __iter__():返回自身。

    • __next__():返回下一个元素;如果没有更多元素,则抛出 StopIteration 异常。

  3. 可迭代对象(Iterable)与迭代器不同:

    • 可迭代对象实现 __iter__() 方法,返回一个迭代器。

    • 迭代器既实现 __iter__() 又实现 __next__()。

1.2 迭代器的创建

  • 迭代器只能往前取值,不会后退

  • 用iter函数可以返回一个可迭代对象的迭代器

# 示例 可迭代对象
L = [1, 3, 5, 7]
it = iter(L)  # 从L对象中获取迭代器
next(it)  # 1  从迭代器中提取一个数据
next(it)  # 3
print(next(it))   # 5
next(it)  # 7
# 示例2 生成器函数
It = iter(range(1, 10, 3))
next(It)  # 1
print(next(It))  # 4
next(It)  # 7

1.3自定义

# 自定义迭代器类
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):
            result = self.data[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration  # 数据迭代结束

# 使用自定义迭代器
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
    print(item)

2、生成器

Generator

生成器是一种特殊的迭代器,通过函数定义,用 yield 语句生成值。生成器可以自动实现迭代协议,无需手动实现 __iter__() 和 __next__()。

2.1 特点

  1. 简洁:比手动实现迭代器更易写。

  2. 惰性计算:生成器在每次调用 next() 时生成一个值,而不是一次性生成所有值。

  3. yield:暂停函数执行并返回值,保留函数的状态,以便下一次继续执行。

示例代码:

# 生成器函数
def my_generator():
    print("Start")
    yield 1
    print("Continue")
    yield 2
    print("End")
    yield 3

# 使用生成器
gen = my_generator()
for val in gen:
    print(val)

2.2 生成器表达式

生成器可以用表达式形式定义,类似列表推导式,但使用小括号 ()。

语法

        (表达式 for 变量 in 可迭代对象 [if 真值表达式])

# 生成器表达式
gen_expr = (x**2 for x in range(5))
print(next(gen_expr))  # 0
print(next(gen_expr))  # 1

2.3应用场景

  • 数据流处理:处理大文件或流式数据,避免内存耗尽。

  • 无限序列生成:如斐波那契数列、素数序列。

  • 管道化数据处理:与 itertools 模块结合使用。

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)

3、 区别对比

特性迭代器生成器
实现通过类实现,手动定义方法使用函数和 yield 定义,自动实现迭代协议
代码简洁性代码较复杂代码简单
状态管理手动管理状态自动保存函数的运行状态
惰性计算支持支持
示例应用自定义复杂的迭代逻辑简单的数据流生成
OpenClaw使用ClawHub安装skill网络不稳定?Rate limit exceeded报错?试试这个国内高速镜像工具! 使用 ClawHub 安装 Skill 时遇到 🌐 网络不稳、❌ Rate limit 或命令不可用?使用这个镜像工具,轻松解决skill安装问题,⚡ 阅读详情

相关推荐

Mixly/Arduino实战:WS2812点阵动态显示自定义图案与汉字

本文手把手教你使用Mixly和Arduino驱动WS2812点阵屏,实现自定义图案与汉字的动态显示。内容涵盖硬件连接、取模软件设置、高效数据处理技巧(巧用Excel)、Mixly图形化编程及Arduino代码解析,并深入探讨动态显示与滚动汉字原理,最后提供常见问题排查与性能优化心得,助你从零开始轻松玩转智能硬件。

weixin_29185199的博客 454

2.生成器

Generator是一种特殊的迭代器,通过函数定义,用 $yield$ 语句生成值。生成器可以自动实现迭代协议,无需手动实现__iter__()和__next__()。

2301_78184797的博客 213

手把手教你配置UFS的PSA状态机:WRITE/UNMAP命令实战与LBA映射避雷

本文详细解析了UFS PSA状态机的配置流程,重点探讨了在Pre-soldering状态下WRITE命令的原子性操作原则与单次写入LBA的重要性。通过实战代码示例,指导开发者如何正确初始化PSA环境、切换状态机,并深入剖析了使用UNMAP命令清理LBA映射时的常见陷阱与避雷指南,确保量产数据安全与良率。

weixin_29213525的博客 420

python之迭代器与生成器

本文介绍了Python中迭代器和生成器的核心概念与应用。迭代器通过实现__iter__()和__next__()方法,支持数据遍历且只能单向访问;生成器则是特殊的迭代器,通过yield关键字实现惰性计算,节省内存。文章通过自定义倒计时迭代器、车牌图片数据处理等案例,展示了二者的实际应用场景,并对比了yield与return的区别。这些特性特别适合处理大数据流,是Python高效编程的重要工具。

2302_80945043的博客 1039

SCI论文Discussion写作:如何用AI工具三步打造审稿人认可的深度逻辑框架

本文针对SCI论文Discussion写作的痛点,提出利用AI工具三步构建深度逻辑框架的方法。首先,使用Claude等工具搭建个性化提纲,解决“浅显病”与“混乱症”;其次,高效整合文献与结果,填充证据;最后,优化逻辑衔接与学术语言,打造审稿人认可的流畅论证。该方法强调研究者主导,AI辅助,显著提升写作效率与深度。

weixin_28235513的博客 236

配置VScode编译、调试STM32(一)手动配置makefile和debug

做嵌入式的朋友们都应该有过想要有个功能强大的IDE或者编辑器,Keil MDK5、IAR EWARM是用的比较普遍的平台了,但是两者在编辑器方面都比较弱势,当然可以设置 或者使用外部编辑器,像Sourceinsight、notePad++这样,但毕竟需要切换回来进行Build、Debug,非常麻烦。 VScode从发布至今口碑一直很好,而且里面有非常多的插件,比如彩虹括号、Code Runner、...

hanhe0551的博客 4289

Python中可迭代对象、迭代器、生成器之间的区别与联系

在Python中,经常可以看到可迭代对象、迭代器、生成器,如何得到一个可迭代对象,如何把它变成迭代器,如何得到生成器,它们到底有什么区别和联系呢? 简单来说,它们的关系如下图 从概念上来说,可迭代对象 > 迭代器 > 生成器。 可迭代对象 可迭代对象Iterable,可以认为是一个容器,其中有N个元素,可以迭代。 在Python中可以简单的认为,能够使用for循环遍历的,...

Jmayday 457

告别玄学调参:手把手教你用LSTM-AutoEncoder为传感器数据做异常检测(实战篇)

本文详细介绍了LSTM-AutoEncoder在传感器数据异常检测中的工程化实践,包括数据预处理、模型架构设计和生产环境部署策略。通过结合LSTM的时间序列处理能力和AutoEncoder的特征提取优势,该方法能够有效识别温湿度、PM2.5等传感器数据的异常模式,适用于工业物联网和室内空气质量监测等场景。

weixin_29212429的博客 477

【Java】迭代器(Iterator)和生成器(Generator)

文章目录1. 迭代器和生成器概述1.1 迭代器1.2 生成器1.3 对比总结2. 代码示例2.1 迭代器代码2.2 生成器代码参考 1. 迭代器和生成器概述 1.1 迭代器 背景 任何容器类都需要持有、插入、取用元素,而对于不同的容器就需要对应具体类型编写不同的方法。为了避免这个缺点,就想到能否写一个通用的代码使得对于任何一种容器,它都可以不关心容器具体的类型就可以进行插入、取用等操作,所以迭代器就是达成这个目的。 迭代器是一个对象,它的工作是遍历并选择序列中的对象,即它是访问集合的方法,而客户端程序员不

Kaimar的博客 1800

【车载以太网】ATU(Address Translation Unit / Address Table Unit)

【车载以太网】ATU(Address Translation Unit / Address Table Unit)

天赐好车的博客 152

lammps构建高熵合金模型+结构优化初步筛选能量最小的结构

lammps构建高熵合金模型+结构优化初步筛选能量最小的结构

qq_45834835的博客 2604

python知识——可迭代对象(Iterable)与迭代器(Iterator)以及生成器(Generator)

这个数据流可以看作是一个有序序列,但是却不能提前知道序列的长度,只能不断通过next()函数来实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才会进行计算。在每次调用 yield 语句时,函数会返回当前的倒数值,并在下一次调用时从上次暂停的地方继续执行。是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

xinxin的博客 645

Android系统内存和性能关系的调研

摘要:本文分析了低内存导致性能问题的判断方法和评估思路。通过监控/proc/vmstat中的allocstall_normal、pageoutrun等指标可判断内存回收频率,当MemFree、MemAvailable和Cached均低于500MB时可能出现明显卡顿。全文通过实验和理论验证分析,回答因内存瓶颈导致性能问题的一些分析和解决的思路。

jidapenglin28的专栏 130

python迭代器和生成器

帮助大家深入了解迭代器与生成器

qq_52758588的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python学习之-迭代器和生成器

在Python中,迭代器(Iterator)和生成器(Generator)是实现迭代协议的对象,用于遍历集合中的元素。它们之间有联系,但也有一些关键的差异。迭代器和生成器都允许你对一系列数据进行迭代,但生成器提供了一种更简便,内存高效的方式来实现迭代器的功能。当你需要一个简单的迭代器并且不想实现类时,生成器是一个非常好的选择。适用场合包括处理大数据流、文件处理、网络通信等等。

Summer的博客 3407

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python生成器和迭代器详解

文章目录前言一、迭代器--从一个简单例子入手1.1 实现__iter__成为迭代对象1.2 通过实现__next__方法成为迭代器二、生成器 -- 更加简单的迭代器2.1来个简单例子2.2 生成器函数yeild2.3 生成器推导式参考文献 前言 python中迭代器和生成器比较抽象,尽量做到通俗易懂。 一、迭代器–从一个简单例子入手 首先,创建一个基础类Dogs,并实例化一个对象,该类希望输出我家有多少条狗。此处我相信大家都能理解。 # 首先创建一个类,实例化一个普通的对象。 class Dogs(obje

wulele2的博客 4244

python 生成器和迭代器

生成器和迭代器,斐波那契数列

m0_51736952的博客 2704

Python中迭代器和生成器理解

容器是一种把多个元素组织在一起的数据结构。容器是包含其他对象的对象,本质是也类。具体的容器就是类的实例化。Python容器类在系统中提供了不同的方法来操作它们所包含的数据,比如添加、删除,查询等。它们都继承自Python的基类,实现了特定的协议(如迭代协议),从而可以进行遍历、索引等操作。迭代是通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做,上一次产生的结果为下一次产生结果的初始状态,如果中途有任何停顿,都不能算是迭代。1) 非迭代例子loop = 0")

raowangcheng的专栏 2126

python 迭代器和生成器

迭代器是一个实现了迭代器协议__iter__():返回迭代器自身(必须);__next__():返回序列中的下一个元素;若无更多元素,抛出异常。通过类实现__iter__()和__next__()self.current = start # 当前迭代值self.end = end # 迭代终止条件return self # 必须返回迭代器对象本身raise StopIteration # 无元素时抛出异常,终止迭代return res# 使用迭代器。

hello world 7222

Python 生成器和迭代器详解

迭代器 在python中列表(list)、元组(tuple)、字典(dict)、集合(set)这些数据容器都有一个共同的特性,它们都支持使用for循环遍历容器中存储的元素,都是可迭代的也成为迭代器。 迭代时访问集合元素的一种非常强大的方式。迭代器可以记住遍历位置,不会对例如列表这样的数据容器一次性全部生成,而是等到用的时候才会去生成。我们也可以创建一个可迭代的对象:只要此对象含有__iter__方法,那么它就是一个可迭代的对象 如果要自定义实现一个迭代器,则类中必须实现以下两个方法: __next(sel

weixin_47906106的博客 2880

Python迭代器和生成器

Python迭代器和生成器

岳来的博客 1798

Python 迭代器和生成器

Python 迭代器和生成器

tangsiqi130的博客 1271

迭代器和生成器详解

python迭代器和生成器详解 一.迭代: 什么是迭代: 迭代就是对list,tuple等数据类型进行for…in循环,这种方式叫遍历,也就是迭代。 什么是迭代对象: 可迭代对象就是从循环中依次取出来的对象。 常见的可迭代对象有:list,tuple,string,dict,range 常见的不可迭代的对象有:数字,布尔值 检测是否是可迭代对象的方法:isinstance(list,Iterable) from collections import Iterable list = [1,3,54,6

br1999的博客 3011

python生成器和迭代器

                                     Python3迭代器和生成器  很多朋友在初次接触 python 的 迭代器 和 生成器 时,总是不理解 生成器 和 迭代器的作用 和它们之间的关系,今天笔者来详细的讲解一下。 知识点目录: 一、迭代器 1.什么是迭代器 2.举例说明 3.StopIteration 异常的作用 4.举例说明 StopItera...

S1433972007LJ的博客 1658
上一篇: OOP基本特性
下一篇: python异常处理
M-YM
博客等级 码龄4年 173粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值