迭代器
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会退后。
迭代器有两个基本的方法: iter() 和 next() 。
字符串,列表或元组对象都可以用于创建迭代器。
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
迭代器对象可以使用常规for语句进行遍历:
#!/usr/bin/python3
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end=" ")
执行以上程序,输出结果如下:
1 2 3 4
创建一个迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 _iter_() 与 _next_()
_iter_() 方法返回一个特殊的迭代对象,这个迭代器对象实现了_next_()方法并通过Stoplteration异常标识迭代的完成。
_next_() 方法会返回下一个迭代器对象。
class MyNumber:
def _iter_(self):
self.a = 1
return self
def _next_(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
执行输出结果为:
1
2
3
4
5
Stoplteration 异常用于标识迭代的完成,防止出现无限循环的情况,在_next_()方法中我们可以设置在完成指定循环次数后触发StopIteration 异常来结束迭代。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration #触发StopIteration异常结束迭代
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
生成器
在Python中,使用了yield 的函数被成为生成器。
生成器是一个返回迭代器的函数,只能用于迭代操作,简单来说生成器就是一个迭代器。
当在生成器函数中使用yield语句时,函数的执行将会暂停,并将yield后面的表达式作为当前迭代的值返回。然后,每次调用生成器的next()方法时或使用for循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到yield语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
调用一个生成器函数,返回的是一个迭代器对象。
def countdown(n):
while n > 0:
yield n
n -= 1
#创建生成器对象
generator = countdown(5)
#通过迭代生成器获取值
print(next(generator)) #输出:5
print(next(generator)) #输出:4
print(next(generator)) #输出:3
#使用for循环迭代生成器
for value in generator:
print(value) #输出:2 1
5
4
3
2
1