迭代器
介绍
迭代是访问集合元素的一种方式,是 python 最强大的功能之一。
迭代器是一个可以记住遍历的位置的对象,该对象访问时从第一个元素开始访问,类似于Java中的 iterator ,每次都指向下一个元素,不会回退,直到全部访问完。
两个基本方法 iter() next()
iter() 用于创建迭代器,字符串,列表以及元组都可以作为入参
next() 用于获取下一个元素
示例:
>>> list1 = ["aaa", 'bbb', "ccc", 'ddd'];
>>> iter1 = iter(list1)
>>> print(next(iter1))
aaa
>>> print(next(iter1))
bbb
>>>
因为属于迭代对象 所以也可以使用 for 去遍历该迭代器
也可以如下操作:
>>> import sys
>>> list1 = ["aaa", 'bbb', "ccc", 'ddd'];
>>> iter1 = iter(list1)
>>> while True:
... try:
... print(next(iter1))
... except StopIteration:
... sys.exit()
...
aaa
bbb
ccc
ddd
迭代器创建
当将一个类作为迭代器来使用时需要实现 __iter__() 与 __next__() 两个方法
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的结束,
__next__() 方法 会返回下一个迭代器对象
例如:
创建一个普通的数字递增的迭代器
class numberIncreat:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
class1 = numberIncreat()
iter1 =iter(class1)
print(iter1)
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
迭代器异常 StopIteration
StopIteration 异常用于标识迭代器迭代的完成,防止不停的迭代下去,可以在 __next__ 中设定指定的迭代次数,达到指定次数后使用该异常终止,具体可以可以参考如下:
>>> class numberIncreat:
... def __iter__(self):
... self.a = 1
... return self
... def __next__(self):
... if self.a <= 10:
... x = self.a
... self.a += 1
... return x
... else:
... raise StopIteration
...
>>> class1 = numberIncreat()
>>> iter1 =iter(class1)
>>> for item in iter1:
... print(item)
...
1
2
3
4
5
6
7
8
9
10
生成器(generator)
Python 中使用yield 的函数被称为生成器
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行
调用一个生成器函数,返回的是一个迭代器对象
参考如下:
import sys
# 函数定义
def function1(n):
a, b, stopNum = 0, 1, 0;
while True:
if stopNum > n:
return;
yield a;
a, b = b, a + b;
stopNum += 1;
# 生成器返回迭代器对象
gene1 = function1(10);
# 迭代
while True:
try:
print(next(gene1), end=", ");
except StopIteration:
sys.exit();