用代码来解释可迭代性,迭代器,生成器的区别

Python中的生成器表达式(generator expression) 需要注意的是,一旦生成器被迭代完成(即所有元素都被生成并迭代),那么再次尝试迭代它将不会返回任何新元素。生成器表达式则不同,它不会立即生成整个列表,而是返回一个生成器对象。生成器对象是一个迭代器,它可以逐个产生元素,而不是一次性生成所有元素,从而节省内存空间。列表解析会立即生成一个完整的列表,并存储在内存中。:生成器表达式返回的生成器对象是可迭代的,这意味着你可以使用for循环或next()函数来逐个访问其元素。当你迭代生成器表达式时,它会在每次迭代时生成并返回一个元素,而不是在开始时创建一个完整的列表。 阅读详情

一. 创造器(creator)

这是我自己造的一个名词,因为在python术语中,对只实现了__next__()方法的对象,好像没有任何名分,为了说明,我将只实现了__next__()方法的对象称为创造器(creator)。

class O_Next:
    def __init__(self):
        self.index = -1
        
    def __next__(self):
        self.index += 1
        return self.index

o_next = O_Next()

import collections
print(isinstance(o_next, collections.Iterable))
print(isinstance(o_next, collections.Iterator))


>>> False
>>> False

通过Python 的类型检查,可以看到,创造器即没有可迭代性,又不是python认可的迭代器,是一个无名英雄,还好我给它起了个名字来识别,创造器。

用标准函数 next(), 每调用一次创造器对象,将运行一次对象内部的__next__()方法;外部调用程序可决定需要调用多少次。

result = [next(o_next) for i in range(5)]
print(result)

result = [next(o_next) for i in range(5)]
print(result)

>>> [0, 1, 2, 3, 4]
>>> [5, 6, 7, 8, 9]

若用 while True 进行调用,对象将会被无限循环地调用下去;可在对象内部增加停止迭代的条件判断,通过触发 StopIteration异常,让调用程序捕获后,来终止迭代处理。

class O_Next2():
    def __init__(self):
        self.index = -1
        
    def __next__(self):
        if self.index > 5 - 1:
            raise StopIteration
        else:
            self.index += 1
            return self.index

o_next2 = O_Next2()
while True:
    try:
        print(next(o_next2))
    except StopIteration as e:
        break  


>>> 0
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5

 

二. 可迭代对象(Iterable)

具有可迭代性的对象是内部只需要实现了 __iter__()方法的对象,该方法必须返回一个实现了 __next__()方法的创造器对象(官方认为必须返回的是迭代器对象,其实不然),否则无法被外部程序用for, list()等方法正常调用。比如: list(), set(), tuple()等,我们可以看看常见容器类型对象的可迭代性,是否为迭代器,及__next__()返回的迭代器对象

import collections

print(isinstance(list(), collections.Iterable), isinstance(list(), collections.Iterator), type(iter(list())))

print(isinstance(set(), collections.Iterable), isinstance(set(), collections.Iterator), type(iter(set())))

print(isinstance(dict(), collections.Iterable), isinstance(dict(), collections.Iterator), type(iter(dict())))

print(isinstance(tuple(), collections.Iterable), isinstance(tuple(), collections.Iterator), type(iter(tuple())))

>>> True False <class 'list_iterator'>
>>> True False <class 'set_iterator'>
>>> True False <class 'dict_keyiterator'>
>>> True False <class 'tuple_iterator'>

可见,常见容器对象具有可迭代性,但不是迭代器,它们有各自专用的迭代器。

接下来,我们自定义一个可迭代的对象,用自定义的创造器(不是迭代器)。

class O_Iter():
    def __iter__(self):
        return O_Next2() 
o_iter = O_Iter()

print(isinstance(o_iter, collections.Iterable), isinstance(o_iter, collections.Iterator),  type(iter(o_iter)))

>>> True False <class '__main__.O_Next2'>

用for, list(),调用可迭代对象,将返回一个创造器对象实例, 然后无限循环调用该创造器对象的 __next__()方法,并自动处理 StopIteration 异常以终止迭代处理。

x = [i for i in o_iter]
print(x)

print(list(o_iter))

>>> [0, 1, 2, 3, 4, 5]
>>> [0, 1, 2, 3, 4, 5]

 

三. 迭代器(Iterator)

迭代器(Iterator)是内部同时实现了__iter__()方法和__next__()方法的对象。

__next__()方法实现创造器逻辑,__iter__()方法提供可迭代性,并返回对象自身,或其它创造器。

在python的世界里,认为实现了__next__()方法的对象,基本都会同时实现__iter__()方法,返回自身,变成迭代器。因此,没有了只实现__next__()方法的创造器的位置。

class O_Iterator():
    def __init__(self):
        self.index = -1
        
    def __next__(self):
        if self.index > 5 - 1:
            raise StopIteration
        else:
            self.index += 1
            return self.index
        
    def __iter__(self):
        return O_Iterator()
    
o_iterator = O_Iterator()

print(isinstance(o_iterator, collections.Iterable), isinstance(o_iterator, collections.Iterator),  type(iter(o_iterator)))


>>> True True <class '__main__.O_Iterator'>

迭代器本身也具有可迭代性

x = [i for i in o_iterator]
print(x)

print(list(o_iterator))

>>> [0, 1, 2, 3, 4, 5]
>>> [0, 1, 2, 3, 4, 5]

 

四. 生成器(generator)

用更优雅简洁的方式来同时实现__iter__(), __next__(), 并自动触发StopIteration 异常

1. 生成器函数

生成器函数的实例调用,具有可迭代性,而且是迭代器

import collections

def o_generator(n):
    index = 0
    
    while index < n:
        yield index
        index += 1

print(isinstance(o_generator(5), collections.Iterable), isinstance(o_generator(5), collections.Iterator),  type(iter(o_generator(5))))

>>> True True <class 'generator'>
x = [i for i in o_generator(5)]
print(x)

print(list(o_generator(5)))

>>> [0, 1, 2, 3, 4]
>>> [0, 1, 2, 3, 4]

2. 生成器表达式

列表生成器不加方括[ ],而是用圆括号( ),就变成了一个生成器对象(generator)

o_gen2 = (i*i for i in range(5))

print(isinstance(o_gen2, collections.Iterable), isinstance(o_gen2, collections.Iterator),  type(iter(o_gen2)))

>>> True True <class 'generator'>

可迭代处理

o_gen2 = (i*i for i in range(5))

x = [i for i in o_gen2]
print(x)

print(list(o_gen2))

>>> [0, 1, 4, 9, 16]
>>> []

为什么第2次 print()输出的为空???

对同一个迭代器对象实例,全部遍历完后,就结束了,不会自己从头再来。 仔细分析观察其他的代码,每次都是重新生成了一个迭代器对象实例(创造器对象实例),初始化后,从头开始遍历的。我们可以把生成器函数的例子改写一下看看,结果将一样。

def o_generator(n):
    index = 0
    
    while index < n:
        yield index
        index += 1


o_gen = o_generator(5)

x = [i for i in o_gen]
print(x)

print(list(o_gen))


>>> [0, 1, 2, 3, 4]
>>> []

 

SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 12-13: truncated \ 问题记录。转义字符 \ 、文件读写。 阅读详情

相关推荐

Python中的生成器表达式与列表推导式:高效数据处理的双剑合璧

列表推导式和生成器表达式是Python中处理数据的强大工具。它们各自适用于不同的场景,理解它们的特点和适用情况对于编写高效、可读性强的Python代码至关重要。通过本文的介绍,你应该能够根据不同的需求选择合适的结构来处理数据。记住,选择合适的工具对于编写成功的软件项目非常重要。不断实践和探索,你将能够更加熟练地运用这些知识解决实际问题。

铭渊老黄 390

python中的可迭代是什么意思,Python中的迭代和可迭代对象

什么是迭代(iteration)呢?给定一个list或者tuple,通过for循环来遍历这个list或者tuple、这种遍历就是迭代(iteration)。只要是可迭代的对象都可以进行迭代、怎么判断一个对象是否是可迭代的对象呢?可以用collections模块里面的iterable包的isinstance函数进行判断:>>> from collections import Ite...

weixin_39974811的博客 1686

2024秋招,腾讯测试与质量管理工程师一面

家人们,秋招都开奖了吗,拿到自己心仪的offer了吗,还是在准备明年的春招呢?今天我记录一下,之前面试腾讯测开的一面过程面试官人非常好,我回答中有问题的地方,及时帮我指正同时耐心回答我的反问只可惜我当时的能力不足以达到鹅厂的标准,遗憾错过。

chowley的博客 1058

生成器(Generator)和迭代器(Iterator)区别

生成器和迭代器都可以用来遍历数据,但是生成器更加灵活和内存友好,因为它可以自动管理状态和延迟执行。迭代器则需要手动实现迭代协议,包括管理状态和抛出异常。在实际编程中,生成器由于其简洁性和高效性,通常更受欢迎。

KIKI3666的博客 5010

NVIDIA DRIVE SDK学习(二)——NvMedia

可以通过使用NvSciBuf API通过NvMedia Tensor属性分配NvSciBuf来创建NvMedia张量。由于NvSciBuf API有助于NvMedia和NVIDIA®CUDA®之间的数据共享,这使得分配的张量可以在NvSciBuf API允许的情况下重复使用。它支持图像聚合操作。NvSciSync组件使得NvMedia组件可以与其他组件保持同步,比如CUDA组件、基于NvSciSync的组件等。立体视差模式:在这种模式下,该模块通过左图像和右图像来产生立体视差,从而进行物体深度测量。

weixin_39592381的博客 3046

5、OpenClaw(龙虾助手)飞书机器人完整对接指南(2026最新版)

OpenClaw v2026.2.2+ 版本,防火墙内也能正常工作,是目前最稳定、最简单的企业内部AI助手部署方案。

欢迎光临~知1而N的博客 457

Python面试:迭代器和生成器

讲讲python的迭代器和生成器 参考:菜鸟教程 如何更好地理解Python迭代器和生成器? 区别:生成器是一种特殊的迭代器,只能迭代一次 迭代器 迭代器是python中的一个强大功能,用于访问集合元素。是一个能记住遍历位置的对象,遍历时只能往前,不能后退。迭代器常用方法有 iter() 和 next(). 把一个类作为迭代器使用需要在类中实现两个函数:__iter__() 和 __next__(). 生成器 Python 中使用了 yield 的函数称为生成器,生成器函数返回一个迭代器。在调用生成器运行的

QI_YUE710的博客 1526

告别TwinCAT:手把手教你用IgH EtherCAT Master在LinuxCNC上搭建实时运动控制平台

本文详细介绍了如何利用IgH EtherCAT Master和LinuxCNC搭建开源实时运动控制平台,替代商业软件TwinCAT。通过分步指南,包括实时Linux环境配置、EtherCAT主站安装、LinuxCNC集成及多轴同步控制实现,帮助开发者构建高性能、低成本的工业自动化解决方案。

weixin_42641741的博客 401

python迭代器和生成器

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

qq_52758588的博客 1万+

实验六 存储器实验

只读存储器(ROM)是一种在正常工作时其存储的数据固定不变,其中的数据只能读出,不能写入,即使断电也能够保留数据,要想在只读存储器中存入或改变数据,必须具备特定的条件。当地址为00000101时,会分别在数据位宽为8,16,32的只读寄存器中找到地址为00000101所对应的十进制地址位置,也就是地址为5的数据,并将其分别以8位,16位,32位输出。因此,输出保持为0。因此,当异步清零信号为1时,无论其他输入信号是什么,触发器的输出都会被强制清零,输出为0。1)寄存器输入0011,使能端1,异步清零0。

wenmou1111的博客 3003

【YOLO26实战全攻略】10——YOLO26+SAM3实战:从检测到像素级分割的全流程指南(含PCB缺陷检测案例)

本文聚焦YOLO26与SAM3的融合应用,系统讲解“检测+分割”的三种核心模式:YOLO26原生分割(轻量高效)、YOLO26检测+SAM3精细分割(精度极致)、SAM3自动标注+YOLO26蒸馏(低成本冷启动)。从环境搭建、数据集准备、模型训练、性能优化到边缘部署,提供 step-by-step 实操教程,配套完整可运行代码与执行结果。结合虚拟PCB缺陷检测案例,展示像素级缺陷识别与几何参数测量的工业级应用流程。本文兼顾新手入门与进阶提升,注重实用价值,读者可直接参考搭建自己的分割系统。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 625

Python 迭代器和生成器:深入理解与应用

数据,避免一次性生成大量数据占用过多内存。理解和掌握迭代器与生成器对于编写高效、简洁且易于维护的 Python 代码至关重要。可以用来创建生成器对象,它能够在需要时生成数据,而不是一次性生成所有数据并存储在内存中。,它使用更简洁的语法来创建迭代器。生成器函数(使用yield。提供了高效、灵活且优雅的方式。的访问方式,而无需暴露容器的内部结构。是两个非常重要的概念,它们为处理。任何包含这两个方法的对象都可以。(如列表、元组、字典等)时提供。容器中的元素,而生成器则可以。在 Python 编程中,

2301_81718046的博客 2581

【项目实战】TARA威胁分析和风险评估

TARA是信息安全领域中的一种风险评估方法,在汽车信息安全的上下文中,TARA分析特别重要,因为它可以帮助识别和管理与智能网联车辆相关的各种威胁,包括数据泄露、未经授权的访问、远程操控等。通过TARA分析,企业可以制定出针对性的安全目标、产品要求和产品安全声明,以确保汽车及其零部件符合相关的信息安全标准和法规。此外,TARA分析还可以与数字化建模系统结合,以更系统化和高效的方式进行风险评估和管理。

奶爸的编程之路,也就一周冷个三天 2710

迭代对象、迭代器、生成器浅析

迭代对象、迭代器、生成器浅析 这三者都是迭代对象,可通过for循环逐个获取对象元素。生成器基本不占用内存无论有多大数据量,但是只能使用一次(也可以通过一些途径使用多次)。 迭代对象 iterables能一次返回一个元素的对象,主要用于for循环。基本上python的所有容器(container)都是可迭代的,比如有序容器list, str, tuple,set 和无序容器dict, file,还

cython22的博客 1187

Hermes Agent 对阵 OpenClaw:自我改进的 AI 队友

但在 2026 年 2 月,Nous Research 发布了 Hermes Agent,它带来了不同的愿景:一个不仅能够运行,还能学习的代理。在完成复杂的多步骤任务后,它会分析自己的操作并创建一个可复用的技能。对于已在使用 OpenClaw 的澳大利亚企业而言,这意味着您可以试用 Hermes Agent,而无需丢失数月的配置和自定义成果。最重要的区别在于理念:OpenClaw 是一个需要配置的工具,而 Hermes Agent 则是一个会学习的队友。OpenClaw 的技能是静态的。

xiaoshun007的专栏 1571

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

什么是迭代器协议?如何实现一个自定义的pythoon迭代器?

_iter__()和__next__()。这两个方法共同构成了迭代器的核心机制。__iter__()方法这个方法返回迭代器对象本身。它是可迭代对象(Iterable)的一部分,确保对象可以被用于迭代操作,如for循环。实现__iter__()方法是为了满足 Python 内置工具(如for循环、map()函数等)对可迭代对象的要求。__next__()方法这个方法返回序列中的下一个元素。当没有更多的元素时,它会引发异常,以终止迭代过程。__next__()

wang15510689957的博客 740

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TypeScript笔记:迭代器和生成器(八)

可迭代性 当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的。 一些内置的类型如 Array,Map,Set,String,Int32Array,Uint32Array等都已经实现了各自的Symbol.iterator。 对象上的Symbol.iterator函数负责返回供迭代的值。 for .. of语句 for..of会遍历可迭代的对象,调用对象上的Symb...

baidu_29474379的博客 389

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python拾遗之迭代器和生成器(一)

迭代器与生成器(一) 环境:Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on win32 关于迭代器 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

JaysenLeo 587

Python 中的生成器(Generator)

生成器是 Python 中一种非常强大的工具,通过yield实现惰性求值,节省内存,并提供简洁的语法。它们非常适合处理大规模数据、无限序列和管道式数据处理。生成器是可迭代对象的一种,但它们的实现方式和使用场景与其他迭代器有所不同。

loulita的博客 734

TypeScript迭代器

迭代器和生成器 可迭代性当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的。 一些内置的类型如 Array,Map,Set,String,Int32Array,Uint32Array等都已经实现了各自的Symbol.iterator。 对象上的 Symbol.iterator函数负责返回供迭代的值。 for..of 语句for..of会遍历可迭代的对象,调用对象上的Sym

xiejunna的博客 2337

转载:《TypeScript 中文入门教程》 15、可迭代性

版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本。 可迭代性 当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的。 一些内置的类型如Array,Map,Set,String,Int32Array,Uint32Array等都已经实现了各自的Symbol.iterator。 对象上的Symbol.iterat...

weixin_30340353的博客 101

揭秘生成器表达式的惰性机制:为何它能节省90%内存?

掌握生成器表达式的惰性求值,轻松解决大数据内存占用问题。通过遍历大文件、处理海量序列等场景,揭示其按需计算、节省90%内存的核心机制。无需预加载,高效优雅,值得收藏。

LogicGlow的博客 337

__iter__方法的隐藏力量,让对象支持for循环的底层机制大公开(仅限专业人士)

掌握迭代器的__iter__实现,让自定义对象轻松支持for循环。详解其底层机制与应用场景,揭示Python迭代协议的核心原理,提升代码效率与可读性,仅限专业人士深入理解,值得收藏。

StepNexus的博客 831

《每天十分钟》-红宝书第4版-对象、类与面向对象编程(七)

与函数类型相似,定义类也有两种主要方式:类声明和类表达式。

lorinzhang 1053

七月在线——python习题笔记

1、Python语言 2、如何测试一个对象是否是一个可迭代对象 3、python标识符命名不能与关键字冲突 4、type可以查看对象是哪种类型的 5、break/continue 6、索引能访问什么类型的数据 7、不同时间点的气温及湿度的观察值可以用字典的形式保存 8、如果一个函数没有return语句,调用它后的返回值为None 9、定义函数时的参数是形参 10、类中的变量一般不允许直接...

呆呆的猫的博客 698

python中每个模块都有一个名称 通过特殊变量_Python语言学习之Python面试前四十问答精选...

本文主要向大家介绍了Python语言学习之Python面试前四十问答精选,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。1、Python是什么?使用Python有什么好处?Python是一种具有对象、模块、线程、异常和自动内存管理的编程语言。pythons的优点在于它简单、可移植、可扩展、内置数据结构,而且它是一个开放源码。2、PEP 8是什么?Pep 8是一种编码约定,是一组...

weixin_39601657的博客 751
上一篇: 可作决策的人工智能
下一篇: 用tkinter.pack设计复杂界面布局
快乐清风客
博客等级 码龄19年 191粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值