【Python】iter()用途及如何创建一个可迭代的对象

mac2026-05-12  7

作用

iter() 函数用来生成迭代器的函数。——所以目的是得到一个迭代器。

那么什么是迭代器呢?

迭代器是实现了__next__()方法的对象,它是访问可迭代序列的一种方式.。

特点

迭代器只能向后移动、不能回到开始、再次迭代只能创建另一个新的迭代对象。 (反序迭代工具:reversed()将返回一个反序访问的迭代器。)实际上要想让一个迭代器工作,至少要实现__iter__()方法和__next__()方法

__iter__()和iter()其实作用是一样的,后面代码部分可以看到。 关于__next__(),其实是 a t + 1 = a t a_{t+1}=a_t at+1=at,即让下一时刻的值替换掉当前时刻,你可以把他看作类似链表一样,我的觉得迭代器和链表非常的相似。

什么时候用迭代器

使用迭代器不要求事先准备好整个迭代过程中的所有元素。

迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。

因此迭代器适合:

遍历一些数量巨大甚至无限的序列

数列有规律,但是依靠列表推导式描述不出来的场合

很多时候使用迭代器完成的工作使用列表也可以完成,但是如果有很多值列表就会占用太多的内存,而且使用迭代器也让我们的程序更加通用、优雅、pythonic。

用代码去理解

基本作用
a = [1,2,3,4] itera = iter(a) print(itera.__next__()) # 可也写成print(next(itera)) print(itera.__next__()) print(itera.__next__()) print(itera.__next__()) print(itera.__next__())

上面的print(itera.__next__())也可写成print(next(itera))

a.__iter__()其实就是相当于iter(a) itera.__nex__()其实就相当于next(itera)

a本身是没有__next__()这个方法的,因此需要通过iter()得到一个具有__next__()的itera (但是a本身有__iter__(),因此可以返回一个可迭代的对象)

会得到

1 2 3 4 报错:StopIteration

__next__()就是相当于不断地读取a的下一个值(即不断地迭代),因为只有四个数,所以当迭代完成后会抛出错误StopIteration

iter()与for…in

其实迭代器和for...in的时候做的事情是一样的,例如:

a = [1,2,3,4] itera = iter(a) for i in a: print(i is itera.__next__())

(==只是比较value,is用于判断是否为同一对象,所以上面用is,具体请看:Python中is和==的区别) 得到:

True True True True

说明for的时候就相当于是调用了iter(a),

iter()与__iter__()

iter(a)和a.__iter__()其实是一个东西,例如

a = [1,2,3,4] iter1 = iter(a) iter2 = a.__iter__() print(iter1.__next__() is iter2.__next__()) print(iter1.__next__() is iter2.__next__()) print(iter1.__next__() is iter2.__next__()) print(iter1.__next__() is iter2.__next__()) print(iter1.__next__() is iter2.__next__())

结果如下

True True True True 报错:StopIteration
创建一个可迭代的对象

如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法。

该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

例如,用迭代的方式,输出10以内的斐波那契数列

class Fib(object): def __init__(self): self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter__(self): return self # 实例本身就是迭代对象,故返回自己 def __next__(self): self.a, self.b = self.b, self.a + self.b # 计算下一个值 if self.a > 10: # 这一行的作用是,当斐波那契值>10时,就人为触发StopIteration,停止继续迭代 raise StopIteration() return self.a # 返回下一个值 fib = Fib() for n in fib: print(n)

fib是一个可以迭代的对象,当使用for...in的时候,会触发__next__()得到不同的结果。 输出结果为:

1 1 2 3 5 8

备注:for循环可以迭代任何可迭代的对象,具体for循环工作原理请看:python iterator总结

参考:

python iter( )函数 Python 迭代器 & __iter__方法 Python迭代器定义与简单用法分析 python iterator总结 Python中is和==的区别)

最新回复(0)