Python-迭代器和可迭代对象

可迭代对象(iterable)


​ 在之前学过的容器中,许多容器都是可迭代对象,可以直接用于for...in...循环的而对象都是可迭代对象,比如:list,tuple,dict,set,str等等。

可迭代对象满足条件:实现了__iter__方法

可迭代对象并不是一种具体的数据类型,比如list是可迭代对象,dict也是可迭代对象。

如何判断一个对象是否是可迭代对象? 使用isinstance()函数

from collections import Iterable 

isinstance("123",Iterable) #字符串是不是可迭代对象 返回True
isinstance(1,Iterable) #数字是不是可迭代对象  返回False

迭代器(iterator)


​ 迭代器是一种带有状态的对象,能够调用next()获取容器的下一个值,但如果调用了next方法,容器没有值可以返回,则会抛出一个StopIteration异常。

迭代器满足的条件:实现__iter__()方法和__next()__方法

迭代器的特点:

​ 1. 获取较多的值得时候(比如一百万个数据),比起使用列表等容器存储,更加省内存。因为迭代器有next方法,不会一次性把所有数据生成,而是一个接一个的计算,当你想要下一个值得时候才给你返回。

两者的关联


结论:

  1. 可迭代对象是包含迭代器的(迭代器一定是可迭代对象,反之却不一定)
  2. 如果一个对象定义了__iter()__方法,那它就是可迭代对象。
  3. 如果一个对象定义了__iter()__方法和__next()__方法,那它就是迭代器。(因为迭代器是可迭代对象,所以一定有__iter()__)

操作:

  • 获取迭代器

    1. 对于python内置的可迭代对象,可以使用函数iter()获取相应的迭代器。(注意这个iter()是内置函数,与__iter()__不同)

      实际上,iter()和__iter()__联系很紧密,iter()是直接调用了对象的__iter()__方法,并且把这个方法的返回值作为自己的返回值。

      在for..in...循环中,比如 for i in list,会先调用iter(list)获取可迭代对象list的迭代器,再每次循环调用迭代器的next()方法获取值。

  • 反向迭代

    1.使用内置函数reversed()

    a = [1,2,3,4,5]
    for i in reversed(a):
      print(i)
    #输出结果为:
    #5
    #4
    #3
    #2
    #1
    

    注意:

    1.反向迭代只适用于对象的大小预先确定了,或者对象实现了__reversed__()的特殊方法的时候才有效。

    2.如果以上两点都不符合,那必须要把对象转为一个列表才可以。

    (如果转为列表,如果可迭代对象的元素很多的话,会很消耗内存!)

你可能感兴趣的:(Python-迭代器和可迭代对象)