如何区分Python中的迭代协议、迭代对象与迭代器?

2026-06-11 11:081阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1413个文字,预计阅读时间需要6分钟。

如何区分Python中的迭代协议、迭代对象与迭代器?

代协议是一种Python内建的抽象,它允许某个对象被迭代。当一个类型定义了`iter()`和`next()`方法时,它表示该类型支持迭代。具体来说:

- `iter()`方法需要返回一个可迭代的对象。- `next()`方法从迭代器中获取下一个元素,并返回它。

这意味着,如果某个类型定义了`iter()`方法,就可以通过`for`循环、`in`、`map`、`zip`等迭代工具来遍历它的实例。例如:

pythonclass MyIterable: def __init__(self, data): self.data=data self.index=0

def iter(self): return self

def next(self): if self.index

使用迭代my_iterable=MyIterable([1, 2, 3, 4])for item in my_iterable: print(item) # 输出: 1, 2, 3, 4

什么是迭代协议

只要某个类型(类)定义了iter()next()方法就表示支持迭代协议。

iter()需要返回一个可迭代对象。只要定义了iter()就表示能够通过for/in/map/zip等迭代工具进行对应的迭代,也可以手动去执行迭代操作

1 for x in Iterator 2 X in Iterator

同时,可迭代对象还可以作为某些函数参数,例如将可迭代对象构建成一个列表list(Iterator)来查看这个可迭代对象会返回哪些数据:

L = list(Iterator)

需要注意的是,for/in/map/zip等迭代工具要操作的对象并不一定要实现iter(),实现了getitem()也可以。getitem()是数值索引迭代的方式,它的优先级低于iter()

如何区分Python中的迭代协议、迭代对象与迭代器?

next()方法用于向前一次返回一个结果,并且在前进到结尾的地方触发StopIteration异常。

再次说明,只要实现了这两个方法的类型,就表示支持迭代协议,可以被迭代。

例如open()的文件类型:

在学习过程中有什么不懂得可以加我的 python学习交流扣扣qun,××× 群里有不错的学习视频教程、开发工具与电子书籍。 与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容 1 >>> f=open(‘a.txt‘) 2 >>> dir(f) 3 [... ‘__iter__‘, ... ‘__next__‘, ...]

但如果看下列表类型、元组、字符串等容器类型的属性列表,会发现没有它们只有iter(),并没有next()

1 >>> dir(list) 2 [... ‘__iter__‘, ...] 3 4 >>> dir(tuple) 5 [... ‘__iter__‘, ...] 6 7 >>> dir(str) 8 [... ‘__iter__‘, ...‘] 9 10 >>> dir(set) 11 [... ‘__iter__‘, ...] 12 13 >>> dir(dict) 14 [... ‘__iter__‘, ...]

但为什么它们能进行迭代呢?继续看下文"可迭代对象"的解释。

什么是迭代对象和迭代器

对于前面的容器类型(list/set/str/tuple/dict)只有iter()而没有next(),但却可以进行迭代操作的原因,是这些容器类型的iter()返回了一个可迭代对象,而这些可迭代对象才是真的支持迭代协议、可进行迭代的对象。

1 >>> L=[1,2,3,4] 2 >>> L_iter = L.__iter__() 3 4 >>> L_iter 5 <list_iterator object at 0x000001E53A105400> 6 7 >>> dir(L_iter) 8 [... ‘__iter__‘, ... ‘__next__‘, ...] 9 10 >>> L.__next__() 11 Traceback (most recent call last): 12 File "<stdin>", line 1, in <module> 13 AttributeError: ‘list‘ object has no attribute ‘__next__‘ 14 15 >>> L_iter.__next__() 16 1 17 >>> L_iter.__next__() 18 2 19 >>> L_iter.__next__() 20 3 21 >>> L_iter.__next__() 22 4

所以,对于容器类型,它们是通过iter()来返回一个迭代对象,然后这个可迭代对象需要支持迭代协议(有iter()next()方法)。

也就是说,所谓的迭代对象是通过iter()来返回的。迭代对象不一定可迭代,只有支持迭代协议的迭代对象才能称为可迭代对象

迭代器则是迭代对象的一种类型统称,只要是可迭代对象,都可以称为迭代器。所以,一般来说,迭代器和可迭代对象是可以混用的概念。但严格点定义,迭代对象是iter()返回的,迭代器是iter()返回的,所以它们的关系是:从迭代对象中获取迭代器(可迭代对象)。

如果要自己定义迭代对象类型,不仅需要返回可迭代对象,还需要这个可迭代对象同时实现了iter()next()

正如open()返回的类型,它有iter()和next(),所以它支持迭代协议,可以被迭代。再者,它的iter()返回的是自身,而自身又实现了这两个方法,所以它是可迭代对象:

1 >>> f = open(‘a.txt‘) 2 >>> f.__iter__() is f 3 True

所以,如果想要知道某个对象是否可迭代,可以直接调用iter()来测试,如果它不抛出异常,则说明可迭代(尽管还要求实现next())。

本文共计1413个文字,预计阅读时间需要6分钟。

如何区分Python中的迭代协议、迭代对象与迭代器?

代协议是一种Python内建的抽象,它允许某个对象被迭代。当一个类型定义了`iter()`和`next()`方法时,它表示该类型支持迭代。具体来说:

- `iter()`方法需要返回一个可迭代的对象。- `next()`方法从迭代器中获取下一个元素,并返回它。

这意味着,如果某个类型定义了`iter()`方法,就可以通过`for`循环、`in`、`map`、`zip`等迭代工具来遍历它的实例。例如:

pythonclass MyIterable: def __init__(self, data): self.data=data self.index=0

def iter(self): return self

def next(self): if self.index

使用迭代my_iterable=MyIterable([1, 2, 3, 4])for item in my_iterable: print(item) # 输出: 1, 2, 3, 4

什么是迭代协议

只要某个类型(类)定义了iter()next()方法就表示支持迭代协议。

iter()需要返回一个可迭代对象。只要定义了iter()就表示能够通过for/in/map/zip等迭代工具进行对应的迭代,也可以手动去执行迭代操作

1 for x in Iterator 2 X in Iterator

同时,可迭代对象还可以作为某些函数参数,例如将可迭代对象构建成一个列表list(Iterator)来查看这个可迭代对象会返回哪些数据:

L = list(Iterator)

需要注意的是,for/in/map/zip等迭代工具要操作的对象并不一定要实现iter(),实现了getitem()也可以。getitem()是数值索引迭代的方式,它的优先级低于iter()

如何区分Python中的迭代协议、迭代对象与迭代器?

next()方法用于向前一次返回一个结果,并且在前进到结尾的地方触发StopIteration异常。

再次说明,只要实现了这两个方法的类型,就表示支持迭代协议,可以被迭代。

例如open()的文件类型:

在学习过程中有什么不懂得可以加我的 python学习交流扣扣qun,××× 群里有不错的学习视频教程、开发工具与电子书籍。 与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容 1 >>> f=open(‘a.txt‘) 2 >>> dir(f) 3 [... ‘__iter__‘, ... ‘__next__‘, ...]

但如果看下列表类型、元组、字符串等容器类型的属性列表,会发现没有它们只有iter(),并没有next()

1 >>> dir(list) 2 [... ‘__iter__‘, ...] 3 4 >>> dir(tuple) 5 [... ‘__iter__‘, ...] 6 7 >>> dir(str) 8 [... ‘__iter__‘, ...‘] 9 10 >>> dir(set) 11 [... ‘__iter__‘, ...] 12 13 >>> dir(dict) 14 [... ‘__iter__‘, ...]

但为什么它们能进行迭代呢?继续看下文"可迭代对象"的解释。

什么是迭代对象和迭代器

对于前面的容器类型(list/set/str/tuple/dict)只有iter()而没有next(),但却可以进行迭代操作的原因,是这些容器类型的iter()返回了一个可迭代对象,而这些可迭代对象才是真的支持迭代协议、可进行迭代的对象。

1 >>> L=[1,2,3,4] 2 >>> L_iter = L.__iter__() 3 4 >>> L_iter 5 <list_iterator object at 0x000001E53A105400> 6 7 >>> dir(L_iter) 8 [... ‘__iter__‘, ... ‘__next__‘, ...] 9 10 >>> L.__next__() 11 Traceback (most recent call last): 12 File "<stdin>", line 1, in <module> 13 AttributeError: ‘list‘ object has no attribute ‘__next__‘ 14 15 >>> L_iter.__next__() 16 1 17 >>> L_iter.__next__() 18 2 19 >>> L_iter.__next__() 20 3 21 >>> L_iter.__next__() 22 4

所以,对于容器类型,它们是通过iter()来返回一个迭代对象,然后这个可迭代对象需要支持迭代协议(有iter()next()方法)。

也就是说,所谓的迭代对象是通过iter()来返回的。迭代对象不一定可迭代,只有支持迭代协议的迭代对象才能称为可迭代对象

迭代器则是迭代对象的一种类型统称,只要是可迭代对象,都可以称为迭代器。所以,一般来说,迭代器和可迭代对象是可以混用的概念。但严格点定义,迭代对象是iter()返回的,迭代器是iter()返回的,所以它们的关系是:从迭代对象中获取迭代器(可迭代对象)。

如果要自己定义迭代对象类型,不仅需要返回可迭代对象,还需要这个可迭代对象同时实现了iter()next()

正如open()返回的类型,它有iter()和next(),所以它支持迭代协议,可以被迭代。再者,它的iter()返回的是自身,而自身又实现了这两个方法,所以它是可迭代对象:

1 >>> f = open(‘a.txt‘) 2 >>> f.__iter__() is f 3 True

所以,如果想要知道某个对象是否可迭代,可以直接调用iter()来测试,如果它不抛出异常,则说明可迭代(尽管还要求实现next())。