首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python迭代器及自定义迭代器

Python迭代器及自定义迭代器

作者头像
Python碎片公众号
发布于 2021-02-26 06:32:05
发布于 2021-02-26 06:32:05
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

一、可迭代对象

Python中,对list、tuple、str等类型的数据可以使用for...in...的循环语法,从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。

在Python的基本数据类型中,列表、元组、字符串、字典都是可迭代的,而整数、浮点数、布尔数都是不可迭代的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list_a = [1, 2, 3]
for a in list_a:
    print(a, end=' ')
 
tuple_b = ('a', 'b', 'c')
for b in tuple_b:
    print(b, end=' ')
 
str_c = 'AKQJ'
for c in str_c:
    print(c, end=' ')
 
dict_d = {'BJ': '北京', 'SH': '上海', 'GZ': '广州', 'SZ': '深圳'}
for d in dict_d:
    print(d, end=' ')

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 2 3 a b c A K Q J BJ SH GZ SZ 

在Python中,把可以通过for...in...这类语句迭代,读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。列表、元组、字符串、字典都是可迭代对象。

可以使用 isinstance() 判断一个对象是否是 Iterable 对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections.abc import Iterable
 
print(isinstance(list_a, Iterable))

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
True

二、可迭代对象的本质

对可迭代对象进行迭代使用的过程,每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。

在这个过程中,我们需要知道每次访问到了第几条数据,以便下一次迭代返回的是下一条数据,不会跳过或者重复返回数据。Python帮我们实现了这个功能,这个功能就是迭代器(Iterator)。

可迭代对象的本质就是提供一个迭代器帮助我们对其进行迭代遍历使用。那Python是怎么实现这些功能的呢?

在Python中,可迭代对象通过__iter__方法向我们提供一个迭代器,在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据。

可迭代对象是一个具备了__iter__方法的对象,通过__iter__方法获取可迭代对象的迭代器。

三、iter()函数与next()函数

列表、元组、字符串、字典等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list_b = ['ppp', 'yyy', 'ttt', 'hhh', 'ooo', 'nnn']
iterator_b = iter(list_b)
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ppp
yyy
ttt
hhh
ooo
nnn

iter(iterable)函数是把可迭代对象的迭代器取出来,内部是调用可迭代对象的__iter__方法,来取得迭代器的。

next(iterator)函数是通过迭代器取得下一个位置的值,内部是调用迭代器对象的__next__方法,来取得下一个位置的值。

当我们已经迭代完最后一个数据之后,再次调用next()函数会抛出StopIteration的异常,来告诉我们所有数据都已迭代完成,不用再执行next()函数了。

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

四、迭代器Iterator

通过上面的分析,我们已经知道,迭代器用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。

在使用next()函数的时候,调用的是迭代器对象的__next__方法。所以,我们要想构造一个迭代器,就要实现它的__next__方法。

同时,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可。

也就是说,一个实现了__iter__方法和__next__方法的对象,就是迭代器,迭代器自身也是一个可迭代对象。

五、自定义迭代器

迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。

如果每次返回的数据值不是在一个已有的数据集合中,而是通过程序按照一定的规律计算生成的,那就不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来,这样可以节省大量的存储(内存)空间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FeiboIterator(object):
    """斐波那契数列迭代器"""
 
    def __init__(self, n):
        # 斐波那数列值的个数
        self.n = n
        # 记录当前遍历的下标
        self.index = 0
        # 斐波那数列前面的两个值
        self.num1 = 0
        self.num2 = 1
 
    def __next__(self):
        """被next()函数调用来获取下一个数"""
        if self.index < self.n:
            num = self.num1
            self.num1, self.num2 = self.num2, self.num1 + self.num2
            self.index += 1
            return num
        else:
            raise StopIteration
 
    def __iter__(self):
        """迭代器的__iter__返回自身即可"""
        return self
 
 
if __name__ == '__main__':
    fb = FeiboIterator(20)
    for num in fb:
        print(num, end=' ')

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

上面的代码中,我们自定义一个类,里面实现了__next__和__iter__方法,__next__方法中每次返回的值是我们通过计算得到的结果,所以可以一直使用next()方法。

当我们通过for...in...循环来遍历迭代斐波那契数列中的前n个数时,会在第n+1次调用next()时抛出StopIteration异常,然后结束for循环,这与Python迭代器的功能是一样的。

所以,我们已经实现了自定义迭代器。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​Python迭代器
我们已经知道可以对 list、tuple、str 等类型的数据使用 for...in... 的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
忆想不到的晖
2021/04/04
5930
Python 迭代器 - Iterable对象
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
Devops海洋的渔夫
2019/06/02
2.2K0
迭代器Python_python进阶路线
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
全栈程序员站长
2022/09/19
2760
爬虫 (二十三) python 迭代器详解 (十四)
相信如果你慢慢把这篇文章读完,然后加以实践,你会对 python 文件操作会有很大的理解,加油看完哦
公众号---人生代码
2020/01/14
6050
爬虫 (二十三) python 迭代器详解 (十四)
【从零学习python 】59.迭代器:优化数据遍历的高效工具
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
全栈若城
2024/02/29
1890
python迭代器详解
Python迭代器是Python编程语言中非常常用的一种工具。它是访问容器(例如列表、元组等)中的元素的一种方式,可以逐个访问容器中的元素,而不必将整个容器存储在内存中。
20岁爱吃必胜客
2023/03/26
6970
python迭代器详解
Python的迭代器与生成器
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一 个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
星陨1357
2023/03/14
4560
Python中的 生成器、迭代器
上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值
用户7886150
2020/11/30
1.4K0
【python】可迭代对象与迭代器
无论你是刚入门python的新兵,还是久经沙场的python老兵。相信在看完这篇本人呕心沥血完成的博客(误人子弟),大家会有新的认识和发现。
读书猿
2024/02/05
3050
一文搞懂Python迭代器(通俗易懂)
python迭代器是一个相对难以理解的概念,Up在初次接触时也觉得晦涩。本文尽可能用通俗易懂的语言和例子,解释清楚python迭代器。
蜘蛛侠在写码
2024/11/30
1970
Python教程(26)——Python迭代器和生成器详解
Python中的迭代器是一种对象,它可以迭代(遍历)一个可迭代对象(比如列表、元组或字符串)的元素。迭代器用于实现迭代器协议,即包含 __iter__() 方法和 __next__() 方法。
一点sir
2024/02/18
3480
Python教程(26)——Python迭代器和生成器详解
探索Python中的迭代器(Iterator)和可迭代对象(Iterable)
在Python编程中,迭代器(Iterator)和可迭代对象(Iterable)是两个重要的概念。它们为我们提供了一种简洁而有效的方式来处理数据集合,同时也是深入理解Python语言内部机制的关键。本文将深入探讨迭代器和可迭代对象的概念、工作原理以及在实际代码中的应用。
疯狂的KK
2023/10/08
6710
探索Python中的迭代器(Iterator)和可迭代对象(Iterable)
python 可迭代对象 迭代器 生成器_Python3迭代器获取
初学者在日常提升Python基本功的时候,可能会被Python的迭代器和生成器搞晕,之前在学习和使用时,本来for in 循环体和enumerate函数用的飞起,觉得自己已经彻底了解了Python的迭代特性,但接触了迭代器和生成器后,突然感觉懵逼,大概率会被可迭代、迭代器、生成器等概念搞的不知所向,本文就是结合日常项目应用,对Python的迭代概念进行系统性的全面解析,包括其底层实现原理,还有一些常见的应用,希望能帮助更多人,同时也算作给自己梳理思路。
全栈程序员站长
2022/11/10
1.2K0
Python: 对迭代器的小结
迭代器 迭代器是在python2.2中被加入的,它为类序列对象提供了一个类序列的接口。有了迭代器可以迭代一个不是序列的对象,因为他表现出了序列的行为。当在python中使用for循环迭代一个对象时,调用者几乎分辨不出他迭代的是一个迭代器对象还是一个序列对象,因为python让他(迭代器)像一个序列那样操作。 如何迭代 本质上说迭代器是个对象,但是这个对象有个特殊的方法next()(在python3中使用__next__()代替了next方法)。当使用for循环来遍历整个对象时候,就会自动调用此对象的__ne
昱良
2018/04/04
8250
Python自学成才之路 迭代器的使用
可迭代对象 实现了__iter__魔术方法的对象是可迭代对象(Iterable)
我是李超人
2020/08/26
4020
python之(__next__和__iter__实现迭代器协议)
参考链接: Python __iter __()和__next __()| 将对象转换为迭代器
用户7886150
2020/11/30
1.5K0
python 中的迭代器与生成器
迭代器模式是一种十分常用的行为设计模式,各种面向对象编程语言大多提供了迭代器模式的实现和具体的工具类,迭代器主要用来按需要的顺序顺次获取容器中的数据项。 我们在此前的文章中用简单明了的例子说明了 Python 中迭代器与关键字 yield 的用法。
用户3147702
2022/06/27
6550
python 中的迭代器与生成器
Fibonacci数列使用迭代器实现
Fibonacci数列,数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... class FibIterator(object): """斐波那契数列迭代器""" def __init__(self, n): """ :param n: int, 指明生成数列的前n个数 """ self.n = n # current用
汪凡
2018/05/29
7260
python迭代器与生成器
可迭代对象的抽象基类是abc.Iterable 迭代器的抽象基类是abc.Iterator
编程黑洞
2023/03/06
2710
python迭代器与生成器
干货推荐:看过介绍 Python 迭代器和生成器最易懂、最全面的文章
迭代器:是访问数据集合内元素的一种方式,一般用来遍历数据,但是他不能像列表一样使用下标来获取数据,也就是说迭代器是不能返回的。
崔庆才
2019/05/06
6250
相关推荐
​Python迭代器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档