第一阶段:迭代器和迭代对象的区别
废话不多说。先上总结
迭代器一定是可迭代对象,但是可迭代对象不一定是迭代器。
什么是迭代器和迭代对象
迭代对象方式一
打印输出看一个对象是否有__iter__属性
from collections import Iterable,Iterator
a=[1,2,3]
print(dir(a))
结果
迭代对象方式二
使用isinstance方法判断某个值是否有iterable属性
代码
from collections import Iterable,Iterator
a=[1,2,3]
print(isinstance(a,Iterable))
结果
迭代器方式一
打印输出看一个对象是否有__iter__属性和__next__属性
代码
from collections import Iterable,Iterator
a=[1,2,3]
# print(isinstance(iter(a),Iterator))
print(dir(iter(a)))
结果
迭代器方式二
使用isinstance方法判断某个值是否有iterator属性
代码
from collections import Iterable,Iterator
a=[1,2,3]
print(isinstance(iter(a),Iterator))
结果
OK说了这么多那到底什么是迭代器并且怎么用呢
1.创建迭代器
from collections import Iterable,Iterator
class objiter(object):
def __init__(self,start,stop):
self.start=start
self.stop=stop
'__iter函数返回self'
def __iter__(self):
return self
'__next__每调用一次都会返回下一个值,当超过最大值时会StopIteration异常' \
'并且__next的值是会记录下来的即每调用一次都会从上一个值开始知道报出异常'
def __next__(self):
if self.start != self.stop:
self.start = self.start + 1
return self.start
else:
raise StopIteration
if __name__ == '__main__':
o=objiter(1,5)
print(o.__next__())
print(o.__next__())
print(o.__next__())
print(o.__next__())
print(o.__next__())
结果
2,ok看到了这里,你应该是知道怎么创建迭代器了,但是丫的到底有啥好处呢
1.从上面我们知道了迭代器和迭代对象的区别,那我们在创建一个迭代对象
def test_A():
'创建迭代对象'
a=[1,2,3,4]
print(a)
print(a)
if __name__ == '__main__':
test_A()
结果
结论
通过结果我们发现迭代对象是打印了2遍的,啊是不是有点明白了
首先迭代对象是可以调用多次的,多次说明什么占用内存啊
迭代器每次都只能打出一个结果,并且下一个值替换了上一个值的内存也就是说从头到尾迭代器只占用了一个内存空间,貌似作用很大哈
而且简单来说for循环就是一个迭代器,你肯定会问那for循环为什么没有抛出stopiteration这个异常呢
哈哈哈,那是因为for循环忽略掉这个异常(这个就不再展开了只需要记住就可以了)
(ok,全篇结束)