小门板儿

Menu

python3-迭代器

1、可迭代(Iterable)对象与迭代器(Iterator)

1.1、可迭代对象

可以直接作用于for循环的对象统称为可迭代对象:Iterable ,比如集合数据类型,如listtupledictsetstr等;或者是generator,包括生成器和带yield的generator function。 可以使用isinstance()判断一个对象是否是Iterable对象 print(isinstance('abc',Iterable))返回结果:true

1.2、迭代器

任何实现了__iter____next__()方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

生成器一定是迭代器(反之不成立)可以使用迭代器进行访问的对象:

序列:字符串、列表、元组

非序列:字典、文件

自定义类:用户自定义的类实现了iter()或getitem()方法的对象判断对象是否是Iterator:

from collections import Iterator​
print(isinstance((x for x in range(10)),Iterator)) #True
print(isinstance([],Iterator)) #False
print(isinstance({},Iterator)) #False
print(isinstance('abc', Iterator)) #False生成器都是 Iterator 对象,但 list、 dict、 str 虽然是 Iterable,却不是Iterator。
#把Iterable对象变成 Iterator:
from collections import Iterator
print(isinstance(iter([]),Iterator)) #True
print(isinstance(iter('ABC'),Iterator)) #True

2、访问迭代器中的元素

使用next() 函数输出迭代器中的下一个值,没有更多的元素时,抛出StopIteration 的错误

list=[1,2,3]
it = iter(list)   # 创建迭代器对象
print (next(it))
print (next(it))
print (next(it))
print (next(it))
输出:
1
2
3
Traceback (most recent call last):
File "D:/learn/pytest/learn.py", line 7, in <module>
  print (next(it))

StopIteration 这是因为 Python 的 Iterator 对象表示的是一个数据流, Iterator 对象可以被 next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration 错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next()函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。

list=[1,2,3,4]   #for循环语句
it = iter(list)   # 创建迭代器对象
for x in it:
  print (x, end="+") #1 2 3 4输出:1+2+3+4+

3、创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。next() 方法会返回下一个迭代器对象。创建一个返回数字的迭代器,初始值为 1,逐步递增 1 防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

class MyTest:
  def __iter__(self):
      self.a=1
      return self
  def __next__(self):
      if self.a<4:
          x = self.a
          self.a += 1
          return x
      else:
          raise StopIteration
​
test=MyTest()
testiter=iter(test)
​
for i in testiter:
  print(i)
输出:
1
2
3

小结 凡是可作用于for循环的对象都是Iterable类型;凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。 Python的for循环本质上就是通过不断调用next()函数实现的

参考来源:https://www.cnblogs.com/xiaojianliu/articles/10018727.html

https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640

— 于 共写了2200个字
— 标签:

评论已关闭。