可迭代对象(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方法,不会一次性把所有数据生成,而是一个接一个的计算,当你想要下一个值得时候才给你返回。
两者的关联
结论:
- 可迭代对象是包含迭代器的(迭代器一定是可迭代对象,反之却不一定)
- 如果一个对象定义了__iter()__方法,那它就是可迭代对象。
- 如果一个对象定义了__iter()__方法和__next()__方法,那它就是迭代器。(因为迭代器是可迭代对象,所以一定有__iter()__)
操作:
-
获取迭代器
-
对于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.如果以上两点都不符合,那必须要把对象转为一个列表才可以。
(如果转为列表,如果可迭代对象的元素很多的话,会很消耗内存!)
网友评论