迭代器的定义:
1. 当类中定义了__iter__和__next__两个方法;
2. __iter__方法需要返回对象本身,即:self;
3. __next__方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常。
# 创建迭代器类
class IT(object):
def __init__(self):
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter
# 根据类实例化创建一个迭代器对象:
obj1 = IT()
v1 = obj1.__next__()
print(v1)
v2 = next(obj1) # 等价于 v2 = obj1.__next__();next()是python的内置函数,可帮我们自动去执行.__next__()函数python
print(v2)
v3 = next(obj1)
print(v3)
1
2
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_12184\3855014687.py in <module>
22 print(v2)
23
---> 24 v3 = next(obj1)
25 print(v3)
26
~\AppData\Local\Temp\ipykernel_12184\3855014687.py in __next__(self)
10 self.counter += 1
11 if self.counter == 3:
---> 12 raise StopIteration()
13 return self.counter
14
StopIteration:
obj2 = IT()
for item in obj2:
print(item)
1
2
解析:
- IT 类有__iter__和__next__函数,且__iter__返回self, __next__规定了没有数据,就抛出StopInteration异常,所以IT类是一个迭代器类;
- obj1是迭代器类实例化的对象,所以obj1是迭代器对象;
- 迭代器对象可通过next函数取值,如果取值结束则自动抛出StopInteration。
- 迭代器对象可通过for进行循环;for循环的内部机制是:先执行迭代器对象的__iter__方法,然后将返回值(也就是迭代器对象本身obj2)获取到,然后不断执行next,将返回的结果赋值给item,(有异常StopInteration 则终止循环)
- 迭代:一步一步向前进,就比如开发一个软件的迭代周期一样。
生成器
定义:有yied的函数就叫生成器
## 创建生成器函数
def fun<