python迭代器入门

python迭代器


迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。


可以使用 hasattr()判断对象是否是“可迭代的”

>>> hasattr(str,'__iter__')
True

定义迭代器对象

使用内置函数 iter 定义迭代器对象。

>>> lst=[1,2,3,4]
>>> iter_lst=iter(lst)
>>> iter_lst
<list_iterator object at 0x0000000002B13FD0>

从返回结果看,iter_lst引用的是迭代器对象,那么那么iter_lst 和 lst这两个对象有什么异同点呢?

>>> hasattr(lst,"__iter__")
True
>>> hasattr(iter_lst,"__iter__")
True

相同点: 都有 "__iter__"说明2着都是可迭代的

>>> hasattr(lst,"__next__")
False
>>> hasattr(iter_lst,"__next__")
True

不同点: 迭代器对象必须有"__next__"方法。

>>> iter_lst.__next__()
1
>>> iter_lst.__next__()
2
.
>>> iter_lst.__next__()
3
>>> iter_lst.__next__()
4
>>> iter_lst.__next__()
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    iter_lst.__next__()
StopIteration

每执行一次__next__方法,迭代器就有一个蒜素被读入内存。列表则是一次性被读入内存。这说明迭代器iter_lst比列表lst节省了内存,所以你懂得。对于元素数量很大或者每个元素比较大的对象,迭代器就很有优势了。
当循环到最后一个元素,在执行__next__方法,会抛出StopIteration异常。

>>> for i in iter_lst:
	print(i)

	
>>> 

如果承接前面的操作,对iter_lst使用for循环,则不会抛出异常(for循环语句会自动捕捉并处理StopIteration异常),但是也没有打印出内容,这是因为迭代器循环到最后一个对象后,不会自动回到最开始。
为了方便理解,可以假设有一个“指针”,当这个指针指到哪里,哪里的元素就被读取。每次执行__next__方法时就是“指针”指向后一个元素的位置,永远也指不到当前元素,所以不执行。

>>> iter_lst = iter(lst)          #重新加载迭代器对象,指针指向了第一个元素。
>>> for i in iter_lst:
	print(i)

	
1
2
3
4

在Python中有一个与迭代器对象类似的内置方法next,它的作用就是返回迭代器对象中指针位置的元素,并向后移动。

>>> next(iter_lst)                    #承接前面的操作,所以报异常。
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    next(iter_lst)
StopIteration
>>> iter_lst = iter(lst)
>>> next(iter_lst)
1
>>> next(iter_lst)
2
>>> 

参考资料《Python大学实用教程》

相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页