在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),迭代器(迭代器)与生成器(发电机)的概念