解决python疑难杂症—什么是迭代协议、迭代对象和迭代器?

什么是迭代协议

只要某个类型(类)定义了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()

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())。

原文地址:https://blog.51cto.com/14568144/2444587

时间: 2024-10-20 08:02:36

解决python疑难杂症—什么是迭代协议、迭代对象和迭代器?的相关文章

解决python疑难杂症python—文件迭代操作,教你读取文件的多种方法

要读取一个文件有很多种方式:按字节数读取.按行读取.按段落读取.一次性全部读取等等.如果不是深入的操作文件数据,按行读.写是最通用的方式. 以下是下面测试时使用的文件a.txt的内容: 1 first line 2 second line 3 third line 在Python中,readline()函数可以一次读取一行,且每次都是前进式的读取一行,读到文件结尾的时候会返回空字符串. 1 >>> f = open('a.txt') 2 >>> f.readline()

Python 迭代器协议以及可迭代对象、迭代器对象

一.迭代器协议定义: 迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而来 while True: #单纯的重复 print('你瞅啥') l=['a','b','c','d'] count=0 while count < len(l): print(l[count]) count+=1 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 二.可迭代对象定义: 实现了迭代器协议

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

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

python开发函数进阶:可迭代的&amp;迭代器&amp;生成器

一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 --对应的标志 __iter__ 2.判断一个变量是不是一个可迭代的 # print('__iter__' in dir(list))# print('__iter__' in dir([1,2,3])) 3.可迭代协议--凡是可迭代的内部都有一个__iter__方法 二,迭代器 1.将可迭代的转化成迭代器 1 #!/usr/bin/env python 2

what&#39;s the python之可迭代对象、迭代器与生成器(附面试题)

可迭代对象 字符串.列表.元祖.集合.字典都是可迭代的,数字是不可迭代的.(可以用for循环遍历取出内部元素的就是可迭代的) 如何查看一个变量是否为可迭代: from collections import Iterable l = [1,2,3,4] t = (1,2,3,4) d = {1:2,3:4} s = {1,2,3,4} print(isinstance(l,Iterable)) print(isinstance(t,Iterable)) print(isinstance(d,Ite

流畅的python第十四章可迭代的对象,迭代器和生成器学习记录

在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章涵盖的话题 语言内部使用 iter(...) 内置函数处理可迭代对象的方式如何使用 Python 实现经典的迭代器模式详细说明生成器函数的工作原理如何使用生成器函数或生成器表达式代替经典的迭代器如何使用标准库中通用的生成器函数如何使用 yield from 语句合并生成器案例分析:在一个数据库转换工

Python中的可迭代对象与迭代器对象

刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 1.迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于依次访问可迭代对象(容器)内元素的操作(?). 2.迭代器对象:具有__next__()方法的对象.该方法能够自动返回下一个结果,当到达序列结尾时,引发StopIteration异常. 3.可迭代对象:具有__iter__()方法的对象.该方法可获取其迭代器对象. 2.迭代过程(以for循环为例) for循环开

Python学习笔记(三)——迭代

知识点 迭代 迭代 什么是迭代呢?和递归又有什么区别呢? 根据维基百科和网上的资料: 迭代:迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果.每一次对过程的重复被称为一次“迭代”, 而每一次迭代得到的结果会被用来作为下一次迭代的初始值. 如求1+2+3+4+5的和: 递归呢?指在函数的定义中使用函数自身的方法.也就是函数不停的调用自己直到满足一定条件. 而用递归是怎样求1--5的和呢? 斐波那契数列的递归和迭代实现: 1 def fib(n): 2 if n>0: 3 if

完全理解Python迭代对象、迭代器、生成器

在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚. 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据