Python学习系列之可迭代对象,迭代器,生成器

理解python中的迭代器对象、可迭代对象、生成器对象 最近又开始学习Python了,但是在遇到迭代器对象、可迭代对象、生成器对象的时候,感到十分懵逼,所以上B站查了下,本文主要参考对象:15分钟彻底搞懂迭代器、可迭代对象、生成器【python迭代器】,有空的话可以看看,up主讲得挺清楚的。 首先来看迭代器对象的定义: 类中定义了__iter__和__next__方法 __iter__方法返回self,也就是自身 __next__方法返回下一个数据,如果没有数据了,则要返回StopIteration的异常(一定要定义什么时候结束迭代,否则就会像没有break的 阅读详情

容器(container)

容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。

  • list, deque, ….
  • set, frozensets, ….
  • dict, defaultdict, OrderedDict, Counter, ….
  • tuple, namedtuple, …
  • str

尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,当然并不是所有的容器都是可迭代的,比如:Bloom filter,虽然Bloom filter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,因为Bloom filter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。

可迭代对象(iterable)

很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状态的files,sockets等等。但凡是可以返回一个迭代器的对象都可称之为可迭代对象。

可迭代对象和容器一样是一种通俗的叫法,并不是指某种具体的数据类型,list是可迭代对象,dict是可迭代对象,set也是可迭代对象。两个独立的迭代器,迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器有一种具体的迭代器类型,比如list_iterator,set_iterator。可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。

迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 。

迭代器(iterator)

它是一个带状态的对象,能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常(从而停止for循环)。

迭代器就是实现了工厂模式的对象,它在你每次你询问要下一个值的时候给你返回。有很多关于迭代器的例子,比如itertools函数返回的都是迭代器对象。

# 无限序列
>>> from itertools import count
>>> counter = count(start=13)
>>> next(counter)
13
>>> next(counter)
14

# 无限循环序列
>>> from itertools import cycle
>>> colors = cycle(['red', 'white', 'blue'])
>>> next(colors)
'red'
>>> next(colors)
'white'
>>> next(colors)
'blue'
>>> next(colors)
'red

# 截取有限序列
>>> from itertools import islice
>>> colors = cycle(['red', 'white', 'blue'])  # infinite
>>> limited = islice(colors, 0, 4)            # finite
>>> for x in limited:                         
...     print(x)
red
white
blue
red

每次调用next()方法的时候做两件事:

  1. 为下一次调用next()方法修改状态
  2. 为当前这次调用生成返回结果

for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束

生成器(generator)

生成器算得上是Python语言中最吸引人的特性之一,生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()和__next__()方法了,只需要一个yiled关键字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一种懒加载的模式生成值。用生成器来实现斐波那契数列的例子是:

def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        prev, curr = curr, curr + prev
 
>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

函数体中没有return关键字,函数的返回值是一个生成器对象。当执行f=fib()返回的是一个生成器对象,此时函数体中的代码并不会执行,只有显示或隐示地调用next的时候才会真正执行里面的代码。

生成器表达式(generator expression)

生成器表达式是列表推导式(List comprehension)的生成器版本,看起来像列表推导式,但是它返回的是一个生成器对象而不是列表对象。实际上是列表推导式的[]换成()。

>>> a = (x*x for x in range(10))
>>> a
<generator object <genexpr> at 0x401f08>
  • 容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象。
  • 可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
  • 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了__next__和__iter__方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
  • 生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield。
对Python中可迭代对象、迭代器、生成器等概念的理解 “迭代”是程序设计中的一个非常重要概念,它可以简单地理解为“重复地做一些事情”。Python提供了迭代器和生成器的功能,但这些概念不易掌握。这篇文章主要是总结下我个人的一些理解。不对之处,恳请各位批评指正。下面所有代码的运行环境为Python 3.6.8。 一. 迭代的必要性 Python程序设计中,我们为什么要学习迭代?首先,采用迭代可以方便地遍历集合类对象(list、tuple、range... 阅读详情

相关推荐

Python与PyTorch系列(十一) 本文(3万字) | 解析python中的 |iterable | iterator | generator|迭代器 | 可迭代对象 | 生成器 |

迭代器 (iterator)是一种用于表示一连串数据流的对象。迭代器对象要求支持迭代器协议——对象须同时支持/实现iter() 方法和next() 方法。iterator.iter()方法返回迭代器对象本身(对可迭代对象使用内置函数 iter() 将返回迭代器),这是同时允许容器和迭代器配合 for … in … 语句使用所必须的。iterator.next()方法返回容器的下一项元素。重复调用迭代器的next。

专注于人工智能学习,总结 1188

Python的itertools模块:迭代器工具的精髓

itertools模块为Python提供了强大的迭代器工具,能够简化和优化各种迭代操作。通过深入了解countcycleaccumulate等函数的使用,你可以更高效地处理迭代任务。希望通过这篇博客,你能更好地理解并掌握itertools模块,从而提高在处理迭代器相关任务时的编程水平。

m0_62153576的博客 461

windows10下 iperf3测试带宽

客户端输入:"iperf3.exe -u -c 服务器IP地址 -b 5g" //客户端给服务器发送udp数据包,最大带宽为5g。客户端输入:“iperf3.exe -c 服务器IP地址 -P 10“//表示客户端10路并行给服务器发送TCP包;上图可知:带宽是15Gbps(这里不知道为什么下面测试的UDP会比这里TCP慢 按道理UDP不可能比TCP慢的5.)3. 验证是否下载成功,在打开的窗口中输入“iperf3.exe -v”,会出现安装的版本,表示安装成功了。5. iperf3参数。

xiaoqixiaoguai的博客 5889

python 生成器对象_Python 可迭代的对象、迭代器和生成器

迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式(Iterator pattern)。Sentence类第1版:单词序列我们要实现一个 Sentence 类,以此打开探索可迭代对象的旅程。我们向这个类的构造方法传入包含一些文本的字符串,然后可以逐个单词迭代。第 1 版要实现序列协议,这个类的对象可以迭代,因为所有序列都...

weixin_39823269的博客 252

从理论到实践:Zemax驱动下的离轴三反光学系统全流程构建

本文详细阐述了从理论推导到软件实现的离轴三反光学系统全流程设计方法。文章首先分析了离轴三反系统在空间遥感等领域的优势,然后手把手指导如何基于像差理论计算共轴三反的初始结构参数,包括曲率半径与圆锥系数。最后,重点介绍了在Zemax中完成从共轴建模、视场离轴设置到优化与性能评估的完整实战步骤,为光学工程师提供了宝贵的经验与避坑指南。

weixin_29205061的博客 237

傅里叶变换实战:用Python手把手教你分析音频频谱(附完整代码)

本文详细介绍了如何使用Python实现傅里叶变换进行音频频谱分析,涵盖音频加载、预处理、FFT应用、频谱可视化及特征提取等关键步骤。通过实战案例和完整代码,帮助开发者掌握数字信号处理技术,特别适合音频分析和音乐信息检索领域的应用。

weixin_29090677的博客 150

Python可迭代对象,迭代器和生成器

一 可迭代对象和迭代器 1.1 可迭代对象(Iterable) 可迭代对象就是有能力一次返回一个值的对象. 可迭代对象的具体实例包括所有的序列类型(如list, str和tuple) 和一些不是序列的类型如dict, 文件对象, 以及带有方法__iter__()或者方法__getitem__()的任意类的对象, 这两个方法实现了序列的语义. 可以使用函数isinstance(obj, Iterable)检查一个对象是否为可迭代对象. 例如: >>> from collections.abc

qq_35125180的博客 497

企业固定资产管理的SAP实战:FICO模块配置与折旧范围设置详解

本文深入解析了SAP FICO模块中固定资产会计配置的核心实践,重点阐述了折旧范围的设计哲学与配置逻辑。通过详解折旧表、折旧范围、资产分类及折旧码等关键配置步骤,指导企业如何搭建满足多会计准则(如CAS、IFRS)与税务要求的资产管理体系,实现资产购置、折旧计提与报废清理的自动化与精准化。

wdx01234567的博客 728

Python 生成器-迭代器-可迭代对象

迭代器 只要定义了 __next__ 方法的对象即为迭代器。 可迭代对象 即提供迭代器的对象。 Python 中任意的对象,只要它定义了一个可返回迭代器的 __iter__ 方法或者定义可以支持下标索引的 __getitem__ 方法,那它即是一个可迭代对象。 举例: Google 是一个可迭代对象,它支持迭代,但我们不能直接对它进行迭代操作。 iter('Google‘) 是一个迭代器。 for c in iter('Google'): print(e) # produces 'G' 'o' 'o' 'g

SLP_L的博客 222

SLUB DEBUG 检测slab 内存泄漏

文章介绍如何定位linux 内核中slab 内存泄漏。

一叶知秋的博客 1489

机器人手眼标定快速精度验证方法

机器人手眼标定快速精度验证方法

laoli_的博客 1万+

Python生成器 (Generators in Python)

只要一个函数function中使用了 yield 这个关键字,就代表这个函数function每次调用时返回的是一个生成器对象 generator object。这个生成器对象的类型是。 包含 yield 语句的函数function本身并不是生成器generator,它仍然是一个函数function。生成器是一个类class,而不是函数function。 生成器是迭代器Iterator的一个子类。 生成器保存的是产生item的生成方法/算法,而不是items

Null的博客 2612

PY32F406K1CU6+I2C+ AT24C64 基本配置

【代码】PY32F406K1CU6+I2C+ AT24C64 基本配置。

sam的博客 90

Python可迭代对象,迭代器,生成器的区别

本篇文章简单谈谈Python中可迭代对象,迭代器和生成器之间的关系。刚开始我认为这两者是等同的,但后来发现并不是这样;直接抛出结论: 可迭代对象包含迭代器。 如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。 定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。 生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要手动实现两方法。 生成器在迭代的过程中可以改变当前迭代值

Nxin的小抄本 3万+

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1898

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Python中的可迭代对象、迭代器和生成器的异同点

最近在学Python里异步IO中的协程,协程最初是由生成器变形的yield而来,感觉学完理解有些困难,故此再来回顾一下之前学习的生成器。在Python学习之初比较容易混淆可迭代对象、迭代器和生成器。因此,做以总结以辨析其中关键的区别。以下仅为习后个人理解,如有偏差,还请指出! Talk is cheap,show me the picture! 解释之前,我们先来看一张概览图,下面是一张关于容...

SL_World的博客 6520

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python可迭代对象、迭代器与生成器

开发者也可以通过实现__iter__()print(num)生成器(Generator)是一种特殊的迭代器,它允许你在需要时才生成值,而不是一次性生成所有值。这种特性使得生成器在处理大量数据或无限序列时特别高效。可迭代对象是最大的集合,包含所有可以迭代的对象迭代器是特殊的可迭代对象,增加了状态记忆能力生成器是最特殊的迭代器,提供了更简洁的实现方式。

2403_88666941的博客 1375

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python基础 — 可迭代对象,迭代器和生成器

2. `send(value)`:除了具有 `next()` 方法的功能外,还可以向生成器函数发送一个值,并将该值作为当前 `yield` 表达式的结果,并使生成器函数从上次暂停的地方继续执行。生成器使用yield语句来定义,当调用生成器函数时,它会返回一个迭代器对象,通过迭代器可以逐步获取生成的值。在上述示例中,可迭代对象 my_list的__iter__()方法返回了一个迭代器对象,而迭代器对象的__next__()方法逐个取出可迭代对象中的元素,知道元素取完会抛出StopIteration异常。

个人博客 3224

Python 迭代器、生成器和可迭代对象详解

在 Python 中,**可迭代对象(Iterable)**是指能够返回一个迭代器的对象。任何实现了iter() 方法或者定义了getitem() 方法的对象,都被认为是可迭代对象。列表(list)元组(tuple)字典(dict)集合(set)字符串(str)迭代器(Iterator)是一个对象,它实现了iter() 和next() 方法,可以在需要时逐个访问集合中的元素。通过迭代器,我们可以一次获取一个元素,而不需要将整个集合加载到内存中。

m0_64881179的博客 1023

python可迭代对象、迭代器和生成器

python可迭代对象、迭代器和生成器 目录python可迭代对象、迭代器和生成器一、简介1、关于迭代器和生成器2、关于可迭代对象二、可迭代对象三、迭代器四、生成器与生成器函数1、生成器函数2、生成器表达式五、Reference 一、简介 1、关于迭代器和生成器 关于python的迭代器和生成器这两个概念,大多数程序员都认为其在功能上是类似的,在python官方文档中也有时认为迭代器就是生成器,其实这两种还是有一定的区别。 使用内置函数iter()可以生成迭代器,使用内置函数next()可以获得迭代器中的值

Shen Mu Xin's Blog 1785

生成器、迭代器与可迭代对象

生成器、迭代器和可迭代对象的差异与联系。

zhouxiaobai666的博客 1126

Python中的for循环、可迭代对象、迭代器和生成器

之前在学习list和dict相关的知识时,遇到了一个常见的问题:如何在遍历list或dict的时候正常删除?例如我们在遍历dict的时候删除,会报错;而在遍历list的时候删除,会有部分元素删除不完全。由这个问题又引发了我对另一个问题的思考:我们通过for循环去遍历一个list或dict时,具体是如何for的呢?即for循环的本质是什么?在查阅了相关资料后,我认识到这是一个和迭代器相关的问题,所以借此机会来详细认识一下Python中的for循环、可迭代对象、迭代器和生成器。.........

xiaoli_Jenny的博客 4504

(一) python可迭代对象,迭代器,生成器

python迭代器 可迭代对象 生成器

Sean_0819的博客 3406

Python 可迭代对象、迭代器、生成器

Python中的可迭代对象、迭代器和生成器是密切相关的概念。可迭代对象(如列表、字符串)实现了__iter__()方法,可被多次遍历;迭代器则通过__next__()方法记录遍历状态,只能遍历一次;生成器是特殊的迭代器,使用yield关键字实现延迟计算和状态保存。三者关系为:可迭代对象→迭代器→生成器。生成器最适合处理大数据流,能显著节省内存。关键区别在于:可迭代对象无状态可重复遍历,迭代器和生成器有状态且一次性使用,生成器通过yield实现更简洁的迭代器创建方式。

weixin_43692357的博客 750

Python 可迭代对象、迭代器、生成器的详解

Python 可迭代对象、迭代器、生成器的详解 一、判断可迭代对象、迭代器: 使用模块from collections import Iterable, Iterator,可以检测该对象是可迭代对象还是迭代器。 Iterable: 检查是否可迭代对象 Iterator:检查是否迭代器 举个例子,判断可迭代对象(Iterable): from collections import Iterable...

Fe_cow的博客 1250
上一篇: Python学习系列之内置函数总结
下一篇: Python的几种文件类型
answer3lin
博客等级 码龄11年 138粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值