一篇文章彻底搞懂Python中可迭代(Iterable),迭代器(迭代器)与生成器(发电机)的概念

  

  

在Python中可迭代(Iterable),迭代器(迭代器)和生成器(发电机)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了。
  

  


  

  

简单的说,一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么用isinstance()函数检查就是Iterable对象,
  

  

例如
  

        类IterObj:      def __iter__(自我):   #这里简单地返回自身   #但实际情况可能不会这么写   #而是通过内置的可迭代对象来实现   #下文的列子中将会展示   返回自我      

上面定义了一个类IterObj并实现了__iter__()方法,这个就是一个可迭代(Iterable)对象
  

        它=IterObj ()   打印(isinstance (Iterable)) #真的   打印(isinstance (Iterator)) #假   打印(isinstance(发电机))#假      

记住这个类,下文我们还会看到这个类的定义。
  

  

<强>常见的可迭代对象
  

  

在Python中有哪些常见的可迭代对象呢?

  
      <李>集合或序列类型(如列表、元组、集、dict str)   <李>文件对象李   <李>在类中定义了__iter__()方法的对象,可以被认为是Iterable对象,但自定义的可迭代对象要能在为循环中正确使用,就需要保证__iter__()实现必须是正确的(即可以通过内置iter()函数转成迭代器对象。关于迭代器下文还会说明,这里留下一个坑,只是记住iter()函数是能够将一个可迭代对象转成迭代器对象,然后在对中使用)   <李>在类中实现了如果只实现__getitem__()的对象可以通过iter()函数转化成迭代器但其本身不是可迭代对象,所以当一个对象能够在为循环中运行,但不一定是Iterable对象。   
  

关于第1、2点我们可以通过以下来验证
  

        print (isinstance ([], Iterable)) #真正的列表是可迭代的   print (isinstance ({}, Iterable)) #真正的字典是可迭代的   打印(isinstance ((), Iterable)) #真正的元组是可迭代的   print (isinstance(设置(),Iterable)) #真正的设置是可迭代的   打印(Iterable isinstance(”) #真正的字符串是可迭代的      currPath=os.path.dirname (os.path.abspath (__file__))   张开(currPath +/model.py)文件:   打印(isinstance(文件,Iterable)) #真正的      

我们再来看第3点,
  

        打印(hasattr ([],“__iter__”)) #真正的   __iter__“print (hasattr({})) #真正的   print (hasattr (()、“__iter__”)) #真正的   打印(hasattr (”、“__iter__”)) #真正的      

这些内置集合或序列对象都有__iter__属性,即他们都实现了同名方法。但这个可迭代对象要在对循环中被使用,那么它就应该能够被内置的iter()函数调用并转化成迭代器对象。
  

  

例如,我们看内置的可迭代对象
  

        print (iter ([])) # & lt;在0 x110243f28> list_iterator对象;   print (iter ({})) # & lt;在0 x110234408> dict_keyiterator对象;   print (iter (())) # & lt;在0 x110243f28> tuple_iterator对象;   打印(iter (“)) # & lt; str_iterator对象在0 x110243f28>      

它们都相应的转成了对应的迭代器(迭代器)对象。
  

  

现在回过头再看看一开始定义的那个IterObj类
  

        类IterObj:      def __iter__(自我):   回归自我      它=IterObj ()   打印(iter (it))      

我们使用了iter()函数,这时候将再控制台上打印出以下信息:
  

  
  

回溯(最近的电话最后):
  ,文件“/用户/mac/PycharmProjects/iterable_iterator_generator。py”, 71行,& lt; module>
  ,,打印(iter (it))
  TypeError: iter()返回non-iterator IterObj”类型的
  

     

出现了类型错误,意思是iter()函数不能将“非迭代器的类型转成迭代器。
  

  

那如何才能将一个可迭代(Iterable)对象转成迭代器(迭代器)对象呢?
  

  

我们修改一下IterObj类的定义
  

        类IterObj:      def __init__(自我):   自我。=(3、5、7、11、13、17、19)      def __iter__(自我):   返回iter (self.a)

一篇文章彻底搞懂Python中可迭代(Iterable),迭代器(迭代器)与生成器(发电机)的概念