python基础知识(一) 可迭代对象和迭代器-------------你真的了解了吗?!!!

一、可迭代对象和迭代器


1. 可迭代对象的概念


  • 可迭代对象就是有__iter__属性的对象

  • Iterable对象的本质是该对象内部实现了一个__iter__方法,也可使用dir函数通过判断该对象是否有__iter__方法来判别是否为Iterable对象

  • 继承迭代器对象,可以用for循环(说明实现了iter方法),只要可以用作for循环的都是可迭代对象

  • 使用for循环实际上干了两件事,首先调用__iter__返回一个对象,该对象必须有__next__方法,然后再循环调用该对象的__next__方法不断获取下一个值。

常见的对象比如string、list、tuple、dict都是Iterable对象,他们都可以for循环遍历每一个元素


2. 迭代器的概念


  • 同时实现了__iter__、__next__方法的对象为迭代器,若一个对象定义了__next__方法,则除了for循环外,还可以将该对象作为next方法的输入参数以获取下一个迭代值。
  • 迭代器(Iterator)它是一种接口,为各种不同的数据结构提供统一的访问机制。 任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
  • 对于迭代器来说,iter 返回的是它自身 self,next 则是返回迭代器中的下一个值,如果没有值了则抛出一个 StopIteration 的异常。
  • 一个迭代器一定是可迭代对象,因为它一定有 iter 方法。反过来则不成立。(事实上,Iterator 就是 Iterable 的子类)
  • 只要可以用next()函数的都是迭代器对象
  • 迭代器的作用:
    • (1)是为各种数据结构,提供一个统一的、简便的访问接口;
    • (2)是使得数据接口的成员能够按照某种次序排列;
    • (3)是ES6创造了一种新的遍历命令for…of循环,Iterator接口主要提供for…of消费

3. 判断该对象是否可迭代的两种方式


  • (1)iter(x)
    • 这是最准确的判断方式,传入要判断的对象,只要对象实现了__getitem__ 、 __iter__中的其中一个,该对象都是可迭代的,否则抛出TypeError: ‘C’ object is not iterable 异常;这儿有个区别,如果 仅仅实现了 getitem调用 iter(x) 返回的是迭代器对象,如果 实现的是 iter那么调用 iter(x) 返回的是生成器对象
  • (2)isinstance(x, abc.Iterable)
    • 该方式会自动忽略 getitem 函数,仅当对象实现了 iter 函数才返回 True,其他一律返回 False

4. 可迭代对象转换成迭代器


用iter()方法即可

from collections import Iterable,Iterator
a = [1,2,3]
a = iter(a)
print(isinstance(a,Iterator))
print(isinstance(a,Iterable))
print(next(a))
print('----')
for x in a:
    print(x)

返回结果:

True
True
1
----
2
3

可以看到现在a是可迭代对象又是一个迭代器,说明列表a中有iter方法,该方法返回的是迭代器,这个时候使用next就可以获取a的下一个值,但是要记住迭代器中的数值只能被获取一次。


总结:

  • 有__iter__方法的对象都是可迭代对象,__iter__方法返回的对象必须含有__next__方法。
  • 同时有__iter__和__next__方法的对象为迭代器
  • 仅有__next__方法的对象不能用for循环遍历,而可以用next方法遍历
  • 因此我们在自定义可迭代对象需要实现 iter 函数;严格来讲,我们还需要实现 getitem 函数,这个函数的主要作用是当前对象可通过下标取值。
  • 使用迭代器的好处在于:它是一种延迟操作,即当需要用到的时候才去产生结果。比如对于一个序列来说,如果我们要遍历它,并不需要再一开始就把所有元素都生成好,而是只需要知道每个元素的下一个元素是什么就可以了。这样可以节省很多空间,尤其对于数量很大的集合来说。
发布了107 篇原创文章 · 获赞 43 · 访问量 6167

猜你喜欢

转载自blog.csdn.net/langdei/article/details/102864798