概念
- 迭代是Python最强大的功能之一,是访问集合元素的一种方式
- 迭代器是一个可以记住遍历的位置的对象
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束
- 迭代器只能往前不会后退
- 迭代器有两种基本的方法:iter()和next()
可迭代对象和迭代器的区别
- 一个实现了iter方法的对象,称为可迭代对象Iterable
- 一个实现了next方法并且是可迭代的对象,称为迭代器iterator
即实现了iter方法和next方法的对象就是迭代器
生成器都是Iterator对象,但是list、dict、str虽然是Iterable(可迭代对象),但却不是Iterator(迭代器)
为什么list、dict、str等数据类型不是Iterator?
Python的Iterator对象表示的是一个数据流。可以把这个数据流看作是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才会计算。所以生成器一定是迭代器。Iterator甚至可以表示一个无限大的数据流,例如全体自然数,而使用list永远不可能存储全部自然数。
for本质循环的
Python3的for循环本质上就是通过不断调用next()函数实现的。
for x in [1,2,3,4,5]:
pass
本质是:
# 获得Iterator对象
it = iter([1,2,3,4,5])
# 循环:
while True:
try:
# 获取下一个值
x = next(it)
except StopIteration:
break
手动创建一个迭代器
# 手动创建一个迭代器
# 一个类作为一个迭代器使用需要在类中是实现两个方法__iter__()与__next__()
# 1、__iter__()方法返回一个特殊的迭代器对象,这个迭代器对象实现了__iter__()方法并通过StopIteration异常标识迭代的完成
# 2、__next__()方法返回下一个迭代器对象
# 创建一个依次返回10,20,30,...这样数字的迭代器
class MyNumbers:
def __iter__(self):
self.num = 10
return self
def __next__(self):
if self.num < 40:
x = self.num
self.num += 10
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))